java 多執行緒

2021-09-02 15:55:56 字數 917 閱讀 3551

一.房子相當於程序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...