併發程式設計 構建自定義的同步工具

2021-08-21 07:14:39 字數 1603 閱讀 7496



1,狀態依賴性的管理

1.1,在單執行緒程式中,如果某乙個基於狀態的前提條件未得到滿足,則這個條件將永遠無法成真,可是,在併發程式中,基於狀態的條件可能由於其他執行緒的操作而改變

2,條件佇列

2.1,他使得一組執行緒能夠通過某種方式來等待特定的條件變為真。傳統佇列的元素是乙個乙個資料,而條件佇列中的元素是乙個乙個正在等待相關條件的執行緒

2.2,object.wait會自動釋放鎖,並請求作業系統掛起當前執行緒,從而使其他執行緒能夠獲得這個鎖並修改物件的狀態,當被掛起的執行緒喚醒來時,它將在返回之前重新獲取鎖

「等待由狀態構成的條件」與「維護狀態一致性」這兩種機制必須被緊密地繫結在一起,只有能對狀態進行檢查時,才能在某個條件上等待,並且只有能修改狀態時,才能從條件等待中釋放另乙個執行緒

3,使用條件佇列

3.1,條件謂詞:要想正確的使用條件佇列,關鍵是找出物件在哪個條件謂詞上等待,條件謂詞是使某個操作成為狀態依賴操作的前提條件。

3.2,每一次wait呼叫都會隱式地與特定的條件謂詞關聯起來,當呼叫某個特定條件謂詞的wait時,呼叫者必須已經持有與條件佇列相關的鎖,並且這個鎖必須保護著構成條件謂詞的狀態變數

3.3,過早喚醒:當乙個wait被喚醒後,並不一定代表他的等待條件已經為真,也可能為真,但是在本執行緒獲取鎖之前,已經由其他執行緒修改了狀態。特別是當乙個謂詞由多個條件組成時,這種喚醒後條件謂詞不為真的情況很常見,因此每當執行緒從wait喚醒後必須再次測試條件謂詞。

3.4,丟失的訊號,指的是執行緒必須等待乙個已經為真的條件,和死鎖或活鎖一樣,丟失的訊號也是一種形式的活躍性故障。

3.5,通知,每當等待乙個條件時,一定要確保在條件謂詞變為真時通過某種方式發出通知。並且發出通知的執行緒應該盡快地釋放鎖,從而確保正在等待的執行緒盡可能快地解除阻塞。如果使用notify而不是notifyall,那麼將是一種危險的操作,因為單一的通知很容易導致類似於訊號丟失的問題,雖然notify比notifyall更低效,但卻更容易確保類的行為時正確的。

4,顯式的condition物件,正如lock是一種廣義的內建鎖,condition也是一種廣義的內建條件佇列。

4.1,如果想編寫乙個帶有多個條件謂詞的併發物件,或者想獲得除了條件佇列可見性之外的更多控制權,就可以使用顯式的lock和condition而不是內建鎖和條件佇列,這是一中更靈活的選擇

4.2,在condition物件中,與wait,notify,notifyall方法對應的分別是await,signal,signalall。

5,aqs

5.1,abstractqueuedsynchrogazer(aqs)是乙個用於構建鎖和同步器的框架,許多同步器都可以通過aqs很容易並且高效地構建出來,包括reentrantlock,semaphore,countdownlatch,reantrantreadwritelcok,synchronousqueue和futuretask。

5.2,aqs負責管理同步容器類中的狀態,它管理了乙個整數狀態資訊,可以通過getstate,setstate以及compareandsetstate等protected型別的方法來進行操作。

自定義日誌工具

import android.util.log created by xiongxl on 2017 2 20.public class logutil public static void d string tag,string msg public static void i string ta...

Docker構建自定義映象

利用dockerfile定製映象 from scratch 製作base image 基礎映象,盡量使用官方的image作為base image from centos 使用base image from ubuntu 14.04 帶有tag的base image label version 1.0...

併發程式設計 Executors(二 自定義執行緒池)

前面介紹到,executor的執行緒池工廠通過threadpoolexecutor來構建帶有特定功能的執行緒池,同樣,也可以使用threadpoolexecutor來構建自定義執行緒池。通過threadpoolexecutor構建自定義執行緒池比較關鍵的是其建構函式中所傳入的佇列型別。使用有界佇列時...