java的執行緒 鎖相關

2021-09-16 21:40:30 字數 1619 閱讀 9952

volatitle

這樣的一行**:

volatitle instance = new singleton(); // instance是volatile變數
彙編後**是這樣子的

0x01a3de1d: movb $0×0,0×1104800(%esi);0x01a3de24: lock addl $0×0,(%esp);
當中有個lock指令,這個指令是做什麼的呢?

1)將當預處理器快取行的資料寫回到系統記憶體。

2)這個寫回記憶體的操作會使在其他cpu裡快取了該記憶體位址的資料無效。

處理器不會直接跟記憶體打交道,而是快取。所以,首先會將值寫會記憶體,而後將該值的所有快取設定為無效,包括多處理器環境下的快取。(那豈不是執行緒安全的?)

synchronized

對於普通同步方法,鎖是當前例項物件。

對於靜態同步方法,鎖是當前類的class物件。

對於同步方法塊,鎖是synchonized括號裡配置的物件。

由於鎖太重,為了提高syn會採取幾種輕量級鎖

1 偏向鎖

hotspot的作者發現,鎖總是由同乙個執行緒獲得,因此當執行緒獲得鎖的時候,會在物件頭和棧幀中的鎖記錄裡儲存鎖偏向的執行緒id,以後該執行緒在進入和退出同步塊時不需要進行cas操作來加鎖和解鎖,只需簡單地測試一下物件頭的mark word裡是否儲存著指向當前執行緒的偏向鎖。如果測試成功,表示執行緒已經獲得了鎖。

如果測試失敗,則需要再測試一下mark word中偏向鎖的標識是否設定成1(表示當前是偏向鎖):如果沒有設定,則使用cas競爭鎖;如果設定了,則嘗試使用cas將物件頭的偏向鎖指向當前執行緒

2 輕量級鎖

執行緒在執行同步塊之前,jvm會先在當前執行緒的棧楨中建立用於儲存鎖記錄的空間,並

將物件頭中的mark word複製到鎖記錄中,官方稱為displaced mark word。然後執行緒嘗試使用cas將物件頭中的mark word替換為指向鎖記錄的指標。如果成功,當前執行緒獲得鎖,如果失敗,表示其他執行緒競爭鎖,當前執行緒便嘗試使用自旋來獲取鎖

單例模式可能的問題

double check可能會存在問題

public class singleton

public static singleton getinstance()

}return instance;}}

在問題步驟中,物件的建立包含了三個環節

1 分配空間

2 棧指標指向空間

3 例項化物件

但由於jvm的指令重排序,可能1->3->2

那麼如果乙個執行緒執行完1->3 跳出了syn塊

那麼第二個執行緒判斷例項非空,直接返回,但事實上並沒有初始化掉,因此存在問題

多執行緒06 鎖相關

1 死鎖 多個執行緒各自占有一些共享資源,並且互相等待其它執行緒占有的資源才能執行,而導致兩個或者多個執行緒都在等待對方釋放資源,互相僵持的情形 2 模擬死鎖場景 public class testdeadlock class lipstick class mirror class makeup i...

Java執行緒相關

今天主要是了解了一些執行緒的相關執行狀態,其中執行緒的同步是個比較讓人困惑的地方。我們知道執行緒的同步有兩種方法,一是用 synchronized 修飾方法 二是使用 synchronized object 同步塊 這裡涉及到乙個監視器物件。因為二者同步的首要條件就是處於同一監視器物件下才能實現同步...

死鎖相關知識的學習

一組程序中,每個程序都無限等待被改組程序中另乙個程序所占有的資源,因而永遠無法得到的資源,這種現象稱為程序死鎖,這一組程序就稱為死鎖程序。如果死鎖發生,會浪費大量系統資源,甚至導致系統崩潰。需要注意 1.資源數量有限 鎖和訊號量錯誤使用 1.1資源的使用方式 申請 分配 使用 釋放 模式 可消耗資源...