public
void
unlock()
放掉乙個鎖和之前的acuqire乙個樣
public
final
boolean
release(int arg)
return
false;
}
release()會先呼叫tryrelease()來嘗試釋放當前執行緒鎖持有的鎖。成功的話,則喚醒後繼等待執行緒,並返回true。否則,直接返回false。
protected
final
boolean
tryrelease(int releases)
// 設定當前執行緒的鎖的狀態。
setstate(c);
return free;
}
tryrelease()的作用是嘗試釋放鎖。
如果「當前執行緒」不是「鎖的持有者」,則丟擲異常。
如果「當前執行緒」在本次釋放鎖操作之後,對鎖的擁有狀態是0(即,當前執行緒徹底釋放該「鎖」),則設定「鎖」的持有者為null,即鎖是可獲取狀態。同時,更新當前執行緒的鎖的狀態為0。
在release()中「當前執行緒」釋放鎖成功的話,會喚醒當前執行緒的後繼執行緒。
根據clh佇列的fifo規則,「當前執行緒」(即已經獲取鎖的執行緒)肯定是head;如果clh佇列非空的話,則喚醒鎖的下乙個等待執行緒。
下面看看unparksuccessor()的原始碼,它在aqs中實現。
private
void
unparksuccessor(node node)
// 喚醒「後繼節點對應的執行緒」
if (s != null)
locksupport.unpark(s.thread);
}
「釋放鎖」的過程相對「獲取鎖」的過程比較簡單。釋放鎖時,主要進行的操作,是更新當前執行緒對應的鎖的狀態。如果當前執行緒對鎖已經徹底釋放,則設定「鎖」的持有執行緒為null,設定當前執行緒的狀態為空,然後喚醒後繼執行緒。 碼農小汪 JVM的重排序
之前看過jvm本書,好多東西都還沒有理解透,今天發現了重排序,有必要去網上找點資料來說說,放在自己的部落格中,好 自己也加深印象。雖然不經常使用。但是概念還是必須要有的澀。我自己記得,就是按照順序的執行動作,最近忙起來,沒有複習這個東西啦,要學習的東西還有很多啦。重排序通常是編譯器或執行時環境為了優...
碼農小汪 設計模式 模板方法
啥子東西叫我做模板,我就不說了吧!這個很清楚的。比如簡歷模板,我們做的卷子也是模板吧,空空給你留著,每人人做的答案各有異同。在模板模式 template pattern 中,乙個抽象類公開定義了執行它的方法的方式 模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計...
碼農小汪 設計模式 抽象工廠模式
抽象工廠 多個抽象產品類,派生出多個具體產品類 乙個抽象工廠類,派生出多個具體工廠類 每個具體工廠類可建立多個具體產品類的例項。即提供乙個建立一系列相關或相互依賴物件的介面,而無需指定他們的具體的類。一對多 的關係。工廠方法 一抽象產品類派生出多個具體產品類 一抽象工廠類派生出多個具體工廠類 每個具...