package java.util.concurrent.locks; public abstract class AbstractOwnableSynchronizer implements java.io.Serializable { private static final long serialVersionUID = 3737899427754241961L;//版本號 //保護構造方法,使得只有同一個包或者繼承的子類才能夠調用 protected AbstractOwnableSynchronizer() { } //獨佔線程(不參與序列化) private transient Thread exclusiveOwnerThread; //設置獨佔線程 protected final void setExclusiveOwnerThread(Thread thread) { exclusiveOwnerThread = thread; } //獲得獨佔線程.若是從未設置,則返回 null protected final Thread getExclusiveOwnerThread() { return exclusiveOwnerThread; } }
已知子類:html
AbstractQueuedLongSynchronizer, AbstractQueuedSynchronizerjava
該抽象類的主要做用是:記錄當前佔用獨佔鎖(互斥鎖)的線程實例。api
例如:ui
在ReentrantLock 源碼中,ReentrantLock 中的 Sync 內部類繼承了AbstractQueuedSynchronizer。spa
在非公平方式獲取鎖的實現中,若獲取鎖成功,就會執行:setExclusiveOwnerThread(current);.net
//沒有線程正在競爭該鎖 if (c == 0) { // 繼承至AbstractQueuedSynchronizer的方法 if (compareAndSetState(0, acquires)) {//若state爲0則將state修改成acquires的值,狀態0表示鎖沒有被佔用 //AbstractQueuedSynchronizer繼承至AbstractOwnableSynchronizer的方法 setExclusiveOwnerThread(current);// 設置當前線程獨佔 return true;// 成功 } }
在試圖在共享模式下獲取共享鎖(讀取鎖)時,若是獲取讀取鎖成功,就會執行:setExclusiveOwnerThread(null); 釋放獨佔的鎖。 線程