一.房子相當於程序process,本身無法做什麼。裡面住了很多人,就相當於執行緒thread,共享這個房子的資源。但是,廁所一次只能進乙個人,進去的人會上鎖。廚房只能進去有限的人,會在門口放幾把鑰匙,進去的人會取一把,出來時再放回去。鑰匙取完時,其它人只能在門口等著。
二.jvm的可見性:當乙個共享變數在多個執行緒工作記憶體中都存在副本時,如果乙個執行緒修改了這個共享變數,其他執行緒能夠看到這個修改後的值,即可見性。
三.jvm的有序性:假如有個共享變數x,執行緒a執行x=x+1,執行緒b執行x=x-1。
a的執行順序:
1 從主存中讀取變數x副本到工作記憶體
2 給x加1
3 將x加1後的值寫回主 存
b的執行順序:
1 從主存中讀取變數x副本到工作記憶體
2 給x減1
3 將x減1後的值寫回主存
實際上順序有可能是這樣的:
1:執行緒a從主存讀取x副本到工作記憶體,工作記憶體中x值為10
2:執行緒b從主存讀取x副本到工作記憶體,工作記憶體中x值為10
3:執行緒a將工作記憶體中x加1,工作記憶體中x值為11
4:執行緒a將x提交主存中,主存中x為11
5:執行緒b將工作記憶體中x值減1,工作記憶體中x值為9
6:執行緒b將x提交到中主存中,主存中x為9
synchronized關鍵字可以保障乙個執行緒計算時,共享變數處於上鎖狀態:
1 獲得同步鎖
2 清空工作記憶體
3 從主存拷貝變數副本到工作記憶體
4 對這些變數計算
5 將變數從工作記憶體寫回到主存
6 釋放鎖
olatile關鍵字,開銷比synchronized要小,但是它只能保證可見性,無法保證有序性。volatile會直接操作主存,沒有執行緒對工作記憶體和主存同步。比較適合直接給共享變數賦值這種操作。
四、多執行緒還是多程序
java多執行緒
在網上看到很有意思的問題,摘下來好好看下 在面試的時候被問了乙個多執行緒的問題 回來仔細思考了一下,多執行緒是否真的能提高了效率?我對多執行緒的理解就是 比如挖乙個隧道,有2種開工方法 1 只在山的一頭挖,直至挖到山的另一頭,從而打通隧道,這可以看成是單執行緒 2 在山的兩頭挖,同時開工,最後在山的...
Java 多執行緒
1。thread類和runnable介面 2。主線程 用thread的static thread currentthread 方法獲得 3。通過實現runnable介面建立執行緒 實現runnable介面的run方法。新執行緒在run 方法返回時結束。注意用這種方法建立程序時,在實現runnable...
JAVA 多執行緒
為hashmap的不正確使用所導致。hashmap在多執行緒環境下使用不安全。使用靜態hashmap作為聯絡人資料快取,key為手機號碼.private static maplxrdata new hashmap 多執行緒環境下不同步hashmap可能導致如下問題 1 多執行緒put操作後可能導致g...