隊列同步器AbstractQueuedSynchronizer源碼解析-AQS使用

AQS 是實現(xiàn)大部分同步組件的基礎

被推薦為定義為自定義同步組件的非public靜態(tài)內(nèi)部類
  1. 通過AQS提供的如下方法對需要用戶重寫的方法(要修改同步器狀態(tài))提供了支持
  1. 需要重寫的方法
  1. 對外暴露的模板方法
  1. 模板設計模式

模板設計模式的意圖是定義算法的整體骨架,然后將部分針對特定細節(jié)的部分聲明為抽象方法逼迫子類去實現(xiàn)(AQS是拋出異常,而不是定義為抽象方法)

  1. 例子

這是AQS源碼附帶的實例程序

public class Mutex implements Lock {
    private static class Sync extends AbstractQueuedSynchronizer {
        //是否處于占用狀態(tài)
        protected boolean isHeldExclusive() {
            return getState() == 1;
        }
        //當狀態(tài)為 0 時獲取鎖
        @SuppressWarnings("Since15")
        public boolean tryAcquired(int acquires) {
            if (compareAndSetState(0, 1)) {
                setExclusiveOwnerThread(Thread.currentThread());
                return true;
            }
            return false;
        }
        //釋放鎖,將狀態(tài)設置為 0
        @SuppressWarnings("Since15")
        protected boolean tryRelease(int releases) {
            if (getState() == 0) {
                throw new IllegalMonitorStateException();
            }
            setExclusiveOwnerThread(null);
            setState(0);
            return true;
        }
        //返回一個Condition,每個condition都包含了一個condition的對隊列
        Condition newCondition(){
            return new ConditionObject();
        }
    }
    //僅僅將操作代理到 Sync 上即可
    private final Sync sync = new Sync();
    public void lock() {
        sync.acquire(1);
    }
    public boolean tryLock() {
        return sync.tryAcquired(1);
    }
    public void unlock() {
        sync.release(1);
    }
    public Condition newCondition() {
        return sync.newCondition();
    }
    public boolean isLocked(){
        return sync.isHeldExclusive();
    }
    public boolean hasQueuedThread(){
        return sync.hasQueuedThreads();
    }
    public void lockInterruptibly() throws InterruptedException{
        sync.acquireInterruptibly(1);
    }
    public boolean tryLock(long timeOut, TimeUnit unit) throws InterruptedException{
        return sync.tryAcquireNanos(1,unit.toNanos(timeOut));
    }
}

在自定義同步組件中的public方法中,去調(diào)用靜態(tài)內(nèi)部類AQS的模板方法,來實現(xiàn)其自定義的同步功能。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,189評論 25 708
  • 原創(chuàng)文章&經(jīng)驗總結(jié)&從校招到A廠一路陽光一路滄桑 詳情請戳www.codercc.com 1. concurren...
    你聽___閱讀 8,675評論 0 37
  • AQS是用來構建鎖或者其他同步組件的基礎框架,能夠?qū)崿F(xiàn)大部分同步需求的基礎,AQS基于volatile變量提供的鎖...
    zhanglbjames閱讀 845評論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,653評論 19 139
  • 花兒謝了 有再開的時候 草兒枯了 有再綠的時候 可是青春去了 便無再返的時候 云兒淡了 有再濃的時候 彩虹褪了 有...
    歲月清淺閱讀 203評論 0 0

友情鏈接更多精彩內(nèi)容