JAVA多執行緒顯示鎖和內建鎖

2021-09-02 14:14:41 字數 1005 閱讀 3869

一、內建鎖:synchronized

1、內建鎖的獲得鎖和釋放鎖是隱式的,進入synchrnozied修飾的**要獲得鎖,走出相應的**要釋放鎖。

2、與synchronized配套使用的執行緒通訊方式:wait() 、notify() 、notifyall()

wait會立刻釋放當前鎖,並進入等待狀態,等待的到相應的notify重新獲得鎖後才繼續執行。

notify不會立刻釋放鎖,而是等到notify所在synchronized**塊全部都執行完以後才會釋放鎖。

notifyall會通知等待佇列中的所有執行緒。

3、內建鎖,在進入同步**塊時,採取的時無限等待的策略,一旦開始等待,就既不能中斷也不能取消,容易產生飢餓和死鎖問題。

二、顯示鎖:reentrantlock

1、需要顯示進行lock和unlock操作

2、renntrantlock實現了lock介面,並提供了與synchronized相同的互斥性和記憶體可見性。

lock lock=new reentrantlock();

上鎖: lock.lock();

釋放鎖:lock.unlock(); (最好放在finally塊中,確保能執行)

3、同步鎖lock也有對應的執行緒通訊機制:condition

condition c=lock.newcondition();

等待: c.await()

喚醒:c.signal() 和 c.signalall()

注意:無論是內建鎖還是顯示鎖,建立多個執行緒時都應該確保所使用的鎖物件都應該是同乙個。

注意:為了避免 虛假喚醒 的問題,wait應該盡可能放在while迴圈判斷中

public static void main(string args)

class ticket implements runnablecatch(exception e)

finally }}

}

Java多執行緒 類鎖和物件鎖

我們設想某個執行緒獨佔某個類,必須執行完才能再次建立物件 預期輸出以下結果 物件鎖示例 關鍵字synchronized取得的鎖都是物件鎖,而不是把一段 方法 當做鎖,所以 中哪個執行緒先執行synchronized關鍵字的方法,哪個執行緒就持有該方法所屬物件的鎖 lock 在靜態方法上加synchr...

Java多執行緒 樂觀鎖 悲觀鎖

悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...

Java多執行緒 鎖物件

前面總結了多個執行緒訪問同乙個物件的同步方法以同步執行,多個執行緒訪問多個物件的同步方法則以非同步方式執行,那如果多個執行緒分別訪問乙個物件中同步方法和非同步方法會如何執行那?demo myobject類 包含了乙個同步方法和乙個非同步方法 public class myobject catch i...