1.volatile詳解
在應用程序中,volatile主要是被設計用來修飾被不同線程訪問和修改的變量
.volatile的本意是“易變的” 因為訪問寄存器要比訪問內存單元快的多,所以編譯器一般都會作減少存取內存的優化,但有可能會讀臟數據。當要求使用volatile聲明變量值的時候,系統總是重新從它所在的內存讀取數據
? int b=a; //語句2
??int c=a;? //語句3?
語句2與語句3中都使用了a的值,優化器在語句3中引用a的值時,認為語句2中已經將a的值讀到寄存器中了,并且在語句2與語句3之間沒有對a進行修改,因此沒必要再到內存中去讀a的值,所以直接使用了寄存器中的值。但是如果在語句3執行前,產生了中斷,中斷恰好對a進行了修改。那么語句3取出來的值就有問題了 如果上面的全局變量a是被修飾為volatile的話,那么優化器就不能去優化語句3,要到內存中去重新取值
2.同步和異步的區別(轉)
同步是阻塞模式,異步是非阻塞模式
同步是指:發送方發出數據后,等接收方發回響應以后才發下一個數據包的通訊方式。 ?
異步是指:發送方發出數據后,不等接收方發回響應,接著發送下個數據包的通訊方式
打電話時同步 發消息是異步
3.java的內存模型
?
Java內存模型中規定了所有的變量都存儲在主內存中,每條線程還有自己的工作內存(可以與前面將的處理器的高速緩存類比),線程的工作內存中保存了該線程使用到的變量到主內存副本拷貝,線程對變量的所有操作(讀取、賦值)都必須在工作內存中進行,而不能直接讀寫主內存中的變量。不同線程之間無法直接訪問對方工作內存中的變量,線程間變量值的傳遞均需要在主內存來完成、
?
項目中使用的設計模式
?
MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器
?
Model(模型)是應用程序中用于處理應用程序數據邏輯的部分。
通常模型對象負責在數據庫中存取數據。
?
View(視圖)是應用程序中處理數據顯示的部分。
通常視圖是依據模型數據創建的。
?
Controller(控制器)是應用程序中處理用戶交互的部分。
通常控制器負責從視圖讀取數據,控制用戶輸入,并向模型發送數據
?
最典型的MVC就是JSP +?servlet?+?javabean的模式
?
單例模式在項目中的應用
?
比如說我們在系統運行時候,就需要加載一些配置和屬性,這些配置和屬性是一定存在了,又是公共的,同時需要在整個生命周期中都存在,所以只需要一份就行,這個時候如果需要我再需要的時候new一個,再給他分配值,顯然是浪費內存并且再賦值沒什么意義,所以這個時候我們就需要單例模式(這個時候我們可以用來創建配置文件的類,完全可以使用單例模式)
?
4.MySQL的性能優化
1.當只要一行數據時使用LIMIT 1
當你查詢表的有些時候,你已經知道結果只會有一條結果,單因為你可能需要去fetch游標,或是你也許會去檢查返回的記錄數。
在這種情況下,加上LIMIT 1 可以增加性能。這樣一樣, MySQL數據庫引擎會在找到一條數據后停止搜索,而不是繼續往后查找下一條符合記錄的數據
2.千萬不要ORDER BY RAND()
3.避免使用select*
從數據庫里讀出越多的數據,那么查詢就會變得越慢。并且,如果你的數據庫服務器和WEB服務器是兩臺獨立的服務器的話,這還會增加網絡傳輸的負載。
4.永遠為表設置ID
我們應該為數據庫里的每張表都設置一個ID作為其主鍵,而最好的是一個INT型(推薦使用UNSIGNED),并設置上自動增長的AUTO INCREMENT標志。
5.使用 ENUM 而不是 VARCHAR ?
ENUM 類型是非常快和緊湊的。在實際上,其保存的是 TINYINT,但其外表上顯示為字符串。這樣一來,用這個字段來做一些選項列表變得相當的完美。
如果你有一個字段,比如“性別”,“國家”,“民族”,“狀態”或“部門”,你知道這些字段的取值是有限而且固定的,那么,你應該使用 ENUM 而不是 VARCHAR。1
6.盡可能的使用 NOT NULL
除非你有一個很特別的原因去使用 NULL 值,你應該總是讓你的字段保持 NOT NULL。這看起來好像有點爭議,請往下看。
首先,問問你自己“Empty”和“NULL”有多大的區別(如果是INT,那就是0和NULL)?如果你覺得它們之間沒有什么區別,那么你就不要使用NULL。(你知道嗎?在 Oracle 里,NULL 和 Empty 的字符串是一樣的!)
7.選擇一個正確的存儲引擎
MyISAM 適合于一些需要大量查詢的應用,但其對于有大量寫操作并不是很好。甚至你只是需要update一個字段,整個表都會被鎖起來,而別的進程,就算是讀進程都無法操作直到讀操作完成。另外,MyISAM 對于 SELECT COUNT(*) 這類的計算是超快無比的。
InnoDB 的趨勢會是一個非常復雜的存儲引擎,對于一些小的應用,它會比 MyISAM 還慢。他是它支持“行鎖” ,于是在寫操作比較多的時候,會更優秀。并且,他還支持更多的高級應用,比如:事務
?
?
?