2. 公平模式
響應中斷
超時需要實現的技術點:
對於鎖的獲取分為公平模式和非公平模式。預設是非公平模式。可由構造器引數來指定。
嘗試獲取鎖,如果獲取成功返回true,如果獲取失敗直接返回false。
獲取鎖。
對於鎖的獲取成功與否,使用cas方式判定。如果獲取失敗,則執行acquire(…)方法。
acquire(…)裡面的其他方法屬於aqs的方法,是aqs提供的執行緒搶占鎖失敗的處理。參考aqs文章
如果成功釋放鎖,喚醒後繼節點。
對同步狀態減一,如果為0,設定exclusiveownerthread為null。
與非公平模式不同的是,公平模式有hasqueuedpredecessors()方法。
判斷在等待佇列中是否有節點在排隊。(頭節點有後繼節點,該後繼節點的執行緒不是當前執行緒。)
h != t,保證等待佇列有節點,不是空佇列。與非公平模式的釋放鎖方法完全相同,這裡不再敘述。(s = h.next) == null,表示當前節點與等待佇列中的連線還沒有完全建立。比如已經呼叫了node.prev = h,但是可能還沒有呼叫 h.next = node。
s.thread != thread.currentthread(),表示s節點的執行緒還沒有搶占鎖。
在獲取鎖的過程中,響應中斷。而上面講的lock()方法,是獲取鎖的過程結束後再處理響應。
該方法是aqs方法,tryacquire(…)上面有說,也分為公平模式和非公平模式,這裡不再敘述。參考aqs文章
該方法是aqs方法,tryacquire(…)上面有說,也分為公平模式和非公平模式,這裡不再敘述。參考aqs文章
java併發 重入鎖 ReentrantLock
使用 github主頁 重入鎖,標識在乙個執行緒中,可重複對該資源重複加鎖。針對於aqs實現重入功能 在重寫tryaquires 的時候考慮同乙個執行緒多次lock的情況即可 偽 thread currentthread thread.currentthread getexclusiveownert...
多執行緒高併發系列之ReenTrantLock鎖
reentrantlock可以替代synchronized鎖,並且比synchronized鎖更靈活 synchronized鎖是自動上鎖 自動解鎖,而reentrantlock需要手動上鎖 手動解鎖synchronized鎖在程式執行時,如果拋異常,jvm會自動釋放鎖,而reentrantlock...
併發程式設計學習 併發程式設計的挑戰
死鎖 資源限制的挑戰 併發程式設計的目的是為了讓程式執行的更快,但是並不是啟動更多的執行緒,就能讓程式最大限度的併發執行。在進行併發程式設計時,如果希望通過多執行緒執行任務讓程式執行的更快,會面臨非常多的挑戰,比如上下文切換的問題,死鎖的問題,以及受限於硬體和軟體的資源限制問題 即使是單核處理器也支...