Condition和object監視器的區別

2021-10-21 21:15:27 字數 1910 閱讀 2963

1.先了解什麼是監視器

任意乙個物件都擁有自己的監視器(monitor.enter–>monitor.exitd對應著獲取鎖和釋放鎖),當這個物件由同步塊或者這個物件的同步方法呼叫時,執行方法的執行緒必須先獲取到該物件的監視器才能進入同步塊或者同步方法(即獲取鎖),而沒有獲取到監視器(執行該方法)的執行緒將會被阻塞在同步塊和同步方法的入口處,進入blocked狀態。

2.object監視器的整個流程

1)使用wait()、notify()和notifyall()時需要先對呼叫物件加鎖。

2)呼叫wait()方法後,執行緒狀態由running變為waiting,並將當前執行緒放置到物件的等待佇列。

3)notify()或notifyall()方法呼叫後,等待執行緒依舊不會從wait()返回,需要呼叫notify()或notifall()的執行緒釋放鎖之後,等待執行緒才有機會從wait()返回。

4)notify()方法將等待佇列中的乙個等待執行緒從等待佇列中移到同步佇列中,而notifyall()方法則是將等待佇列中所有的執行緒全部移到同步佇列,被移動的執行緒狀態由waiting變為blocked。

5)從wait()方法返回的前提是獲得了呼叫物件的鎖。

這個就是等待通知機制

我自己的看法就是乙個執行緒嘗試著獲取鎖,獲取失敗加入同步佇列,如果成功在執行中可能會觸發wait()加入等待佇列,之後同步佇列其他執行緒之一執行,當遇到某一線程執行notify或者notifyall方法,使得從等待執行緒進入同步執行緒,等執行緒執行完畢,同步佇列執行緒就可以繼續競爭按照演算法獲取鎖。(即完成了notify執行緒對wait執行緒的通知)

3.candition介面與監視器區別

condition介面也提供了類似object的監視器方法,與lock配合可以實現等

待/通知模式具體區別:

關鍵的是每個condition物件都包含著乙個佇列(以下稱為等待佇列),該佇列是condition物件實現等待/通知功能的關鍵。

使用方法:

1.condition定義了等待/通知兩種型別的方法,當前執行緒呼叫這些方法時,需要提前獲取到condition物件關聯的鎖。condition物件是由lock物件(呼叫lock物件的newcondition()方法)建立出來的,換句話說,condition是依賴lock物件的。

2如果乙個執行緒呼叫了condition.await()方法,那麼該執行緒將會釋放鎖、構造成節點加入等待佇列並進入等待狀態。當呼叫await()方法時,相當於同

步佇列的首節點(獲取了鎖的節點)移動到condition的等待佇列中。

3呼叫condition的signal()方法,將會喚醒在等待佇列中等待時間最長的節點(首節點),在喚醒節點之前,會將節點移到同步佇列中。

mutex和condition的用法

分享一下用到的mutex和condition用法。mutex一般有兩種使用情況,一種是單獨使用,保護臨界區。一種是和condition配合使用,可以等待某condition拿到之後再向下走。condition 有兩種signal形式,single和 broadcast,下面例子是signal的,做個...

redis中condition和unless的區別

1.註解的condition和unless的區別,condition對傳入值生效,unless對結果result生效,使用了錯誤的result導致報空錯誤 2.key鍵生成策略,不能再key中直接呼叫工具類的方法,將方法寫在同乙個類下,使用 root.target.methodname p0.att...

Lock和Condition物件的使用

condition的await 方法 void await throws interruptedexception導致當前執行緒等到發訊號或interrupted 在所有情況下,在此方法返回之前,當前執行緒必須重新獲取與此條件相關的鎖。當執行緒返回時,它保證保持此鎖。實現兩個執行緒交替執行的案例 c...