併發程式設計 四

2021-10-23 09:45:24 字數 1222 閱讀 5623

是指乙個執行緒a呼叫了物件o的wait()方法進入等待狀態,而另乙個執行緒b呼叫了物件o的notify()或者notifyall()方法,執行緒a收到通知後從物件o的wait()方法返回,進而執行後續操作。上述兩個執行緒通過物件o來完成互動,而物件上的wait()和notify/notifyall()的關係就如同開關訊號一樣,用來完成等待方和通知方之間的互動工作。

notify():

通知乙個在物件上等待的執行緒,使其從wait方法返回,而返回的前提是該執行緒獲取到了物件的鎖,沒有獲得鎖的執行緒重新進入waiting狀態。

notifyall():

通知所有等待在該物件上的執行緒

wait()

呼叫該方法的執行緒進入 waiting狀態,只有等待另外執行緒的通知或被中斷才會返回.需要注意,呼叫wait()方法後,會釋放物件的鎖

wait(long)

超時等待一段時間,這裡的引數時間是毫秒,也就是等待長達n毫秒,如果沒有通知就超時返回

wait (long,int)

對於超時時間更細粒度的控制,可以達到納秒

1)獲取物件的鎖。

2)如果條件不滿足,那麼呼叫物件的wait()方法,被通知後仍要檢查條件。

3)條件滿足則執行對應的邏輯。

通知方遵循如下原則。

1)獲得物件的鎖。

2)改變條件。

3)通知所有等待在物件上的執行緒。

該事例參考於此鏈結(

在呼叫wait()、notify()系列方法之前,執行緒必須要獲得該物件的物件級別鎖,即只能在同步方法或同步塊中呼叫wait()方法、notify()系列方法,進入wait()方法後,當前執行緒釋放鎖,在從wait()返回前,執行緒與其他執行緒競爭重新獲得鎖, 執行notify()系列方法的執行緒退出呼叫了notifyall的synchronized**塊的時候後,他們就會去競爭。如果其中乙個執行緒獲得了該物件鎖,它就會繼續往下執行,在它退出synchronized**塊,釋放鎖後,其他的已經被喚醒的執行緒將會繼續競爭獲取該鎖,一直進行下去,直到所有被喚醒的執行緒都執行完畢。

盡可能用notifyall(),謹慎使用notify(),因為notify()只會喚醒乙個執行緒,我們無法確保被喚醒的這個執行緒一定就是我們需要喚醒的執行緒。

併發程式設計(四)

在併發佇列上jdk提供了兩套實現,乙個是以concurrentlinkedqueue為代表的高效能佇列,乙個是以blockingqueue介面為代表的阻塞佇列,無論哪種都繼承自queue。1 concurrentlinkedqueue 是乙個適用於高併發場景下的佇列,通過無鎖的方式,實現了高併發狀態...

併發程式設計(四)

上篇部落格介紹了程序的建立,程序的相關屬性以及三種特殊程序 殭屍程序,孤兒程序和守護程序.守護程序是乙個在後台執行並且不受任何終端控制的程序,用於執行特定的系統任務.很多守護程序在系統引導的時候啟動,並且一直執行直到系統關閉.另一些只在需要的時候才啟動,完成任務後就自動結束.本篇部落格詳細介紹守護程...

併發程式設計框架篇(四)

一 disruptor框架 1 disruptor礦機在jvm平台上,其核心是乙個業務邏輯處理器,它能夠在乙個執行緒裡每秒處理6百萬訂單 業務邏輯處理器完全是在記憶體中,使用事件源驅動方式。業務邏輯處理器的核心是disruptor。2 disruptor它是乙個開源的併發框架,並獲得2011 duk...