併發程式設計 Condition

2021-10-25 08:39:47 字數 2305 閱讀 7904

condition實現對執行緒的等待、喚醒。

等待和喚醒的方法的呼叫需要在lock.lock()與lock.unlock()之間,在阻塞的過程中會釋放同步狀態。

與wait方式不同的是,它額外支援響應中斷、截止時間(deadline)等待。與notify隨機喚醒執行緒方式不同的是,condition支援特定執行緒喚醒(條件佇列中隊首執行緒)。

e.g.

public

class

conditiondemo

implements

runnable

catch

(interruptedexception e)

finally

}public

static

void

main

(string[

] args)

throws interruptedexception

finally

}}

使當前執行緒等待,自動釋放關聯的鎖,響應中斷。

有如下四種方式進行喚醒:

該方法呼叫的時候需要獲取condition關聯的鎖。被喚醒之後,也需要重新獲取condition關聯的鎖。

接下來看下aqs裡對於該方法的實現:

判斷是否執行緒中斷。

將當前執行緒封裝成乙個condition狀態的節點。然後在條件佇列隊尾進行新增。

完全釋放同步狀態。

判斷節點是否在條件佇列中。如果在,則一直阻塞。

等待的過程中響應中斷,嘗試將節點轉移到同步佇列中。

其他執行緒呼叫signal或者signalall方法,該節點轉移到同步佇列中,重新嘗試獲取鎖。

對執行緒中斷進行處理。

將當前執行緒封裝成乙個condition狀態的節點。然後在條件佇列隊尾進行新增。

在條件佇列中取消非condition狀態的節點的鏈結。

完全釋放同步狀態。

判斷節點是否處於同步佇列中。

prev、next在同步佇列中指代前驅節點、後繼節點。

而條件佇列中使用的是nextwaiter,指代後繼節點。

前驅節點不為空,後繼節點為空,則呼叫如下方法查詢判斷。

從尾節點開始,判斷給定節點是否在同步佇列中。

在等待的過程中,響應中斷。

嘗試將節點轉移到同步佇列中。

根據interruptmode,採取丟擲可中斷異常 或者 執行執行緒中斷方法。

與await不同的是:執行緒一開始呼叫該方法以及等待的過程中不響應中斷。等待過程結束後再去對中斷進行處理。

超時等待。

超時等待。

截止時間等待。

喚醒乙個條件等待的執行緒。

呼叫該方法時,需要先獲取condition關聯的鎖。

喚醒條件佇列中的隊首節點。

將條件佇列中的節點轉移到同步佇列中。

如果此刻,節點為取消狀態 或者 cas方式修改狀態失敗,則喚醒執行緒。

喚醒所有條件等待的執行緒。

呼叫該方法時,需要先獲取condition關聯的鎖。

併發程式設計四(4) 執行緒同步 Condition

import threading import time def consumer cond with cond print consumer before wait cond.wait 等待消費 相當於程序就緒狀態 print consumer after wait def producer co...

併發程式設計學習 併發程式設計的挑戰

死鎖 資源限制的挑戰 併發程式設計的目的是為了讓程式執行的更快,但是並不是啟動更多的執行緒,就能讓程式最大限度的併發執行。在進行併發程式設計時,如果希望通過多執行緒執行任務讓程式執行的更快,會面臨非常多的挑戰,比如上下文切換的問題,死鎖的問題,以及受限於硬體和軟體的資源限制問題 即使是單核處理器也支...

網路程式設計 併發程式設計

01 網路程式設計 軟體開發架構 osi七層協議 乙太網協議 ip 埠 tcp udp 02 tcp的三次握手四次揮手理解及面試題 03 socket套接字使用 tcp連線通訊迴圈 tcp粘包問題 struct模組 tcp傳送檔案 04 udp協議 tcp udp基於socketserver的併發 ...