寫在開頭 今天在牛客上看到了一個帖子,一個網友吐槽美團一面上來就讓手撕同步器,沒整出來,結果面試直接涼涼。 就此聯(lián)想到一周前寫的一篇關于AQS知識點解析的博文,當時也曾埋下伏筆說后面會根據AQS的原理實現一個自定義的同步器,那今天就來把這個坑給填上哈。 常用的AQS架構同步器類 自定義同步器實現步驟
今天在牛客上看到了一個帖子,一個網友吐槽美團一面上來就讓手撕同步器,沒整出來,結果面試直接涼涼。
就此聯(lián)想到一周前寫的一篇關于AQS知識點解析的博文,當時也曾埋下伏筆說后面會根據AQS的原理實現一個自定義的同步器,那今天就來把這個坑給填上哈。
在上一篇文章中我們就已經提過了AQS是基于
模版方法模式
的,我們基于此的自定義同步器設計一般需要如下兩步:
1. 使用者繼承 AbstractQueuedSynchronizer 并重寫指定的方法;
2. 將 AQS 組合在自定義同步組件的實現中,并調用其模板方法,而這些模板方法會調用使用者重寫的方法。
在模板方法模式下,有個很重要的東西,那就是
“鉤子方法”
,這是一種抽象類中的方法,一般使用 protected 關鍵字修飾,可以給與默認實現,空方法居多,其內容邏輯由子類實現,為什么不使用抽象方法呢?因為,抽象方法需要子類全部實現,增加大量代碼冗余!
Ok,有了這層理論知識,我們去看看Java中根據AQS實現的同步工具類有哪些吧
在前面我們講過的synchronized 和 ReentrantLock 都是一次只允許一個線程訪問某個資源,而Semaphore(信號量)可以用來控制同時訪問特定資源的線程數量,它并不能保證線程安全。
小編推薦閱讀