Mutex是互斥體廣泛地應用在多線程編程中本文以廣為流程的Doug Lea的concurrent工具包的Mutex實現為例進行一點探討在Doug Lea的concurrent工具包中Mutex實現了Sync接口該接口是concurrent工具包中所有鎖(lock)門(gate)和條件變量(condition)的公共接口Sync的實現類主要有MutexSemaphore及其子類LatchCountDownReentrantLock等這也體現了面向抽象編程的思想使我們可以在不改變代碼或者改變少量代碼的情況下選擇使用Sync的不同實現下面是Sync接口的定義
public interface Sync
{
public void acquire() throws InterruptedException;
//獲取許可
public boolean attempt(long msecs) throws InterruptedException;
//嘗試獲取許可
public void release();
//釋放許可
}
通過使用Sync可以替代Java synchronized關鍵字並提供更加靈活的同步控制當然並不是說 concurrent工具包是和Java synchronized獨立的技術其實concurrent工具包也是在synchronized的基礎上搭建的從下面對Mutex源碼的解析即可以看到這一點synchronized關鍵字僅在方法內或者代碼塊內有效而使用Sync卻可以跨越方法甚至通過在對象之間傳遞跨越對象進行同步這是Sync及concurrent工具包比直接使用synchronized更加強大的地方
注意Sync中的acquire()和attempt()都會拋出InterruptedException所以使用Sync及其子類時調用這些方法一定要捕獲InterruptedException而release()方法並不會拋出InterruptedException這是因為在acquire()和attempt()方法中可能會調用wait()等待其它線程釋放鎖而release()在實現上進行了簡化直接釋放鎖不管是否真的持有所以你可以對一個並沒有acquire()的線程調用release()這也不會有什麼問題而由於release()不會拋出InterruptedException所以我們可以在catch或finally子句中調用release()以保證獲得的鎖能夠被正確釋放比如
class X
{
Sync gate; //
public void m()
{
try
{
gateacquire();
// block until condition holds
try
{
// method body
}
finally { gaterelease(); }
}
catch (InterruptedException ex) { // evasive action }
}
}
[] [] []
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27679.html