ReentranLock底層原理分析

1 J.U.C簡介

  • java.util.concurrent 簡稱,java并發(fā)工具包
  • 線程池
  • 阻塞隊(duì)列
  • 計(jì)時器/同步器
  • 并發(fā)集合

2 Lock的基本使用

  • synchronized 不夠靈活,鎖的釋放無法人為控制,只能等待同步代碼塊執(zhí)行完成或發(fā)生異常
  • Lock java.util.concurrent.locks 包下的接口,提供了鎖的獲得與釋放的接口方法,在JUC中存在眾多實(shí)現(xiàn)
    image.png

3 ReentranLock重入鎖

  • 同一線程 通過Lock.lock()獲得重入鎖,當(dāng)此線程再次調(diào)用時不會被阻塞可以進(jìn)入,即:同一線程"一次鎖定多次進(jìn)入",其它線程此時調(diào)用進(jìn)行阻塞
  • synchronized 也支持重入
  • ReentranLock重入鎖的設(shè)計(jì)目的是為了解決死鎖
public class ThreadDemo1 {

    public synchronized void func1(){//獲取對象鎖
        System.out.println("func1");
        func2();
    }

    public void func2(){
        synchronized (this){//同一線程,同一把鎖允許重入,增加重入次數(shù),并沒有死鎖
            System.out.println("func2");
        }//同步代碼執(zhí)行完成,減少重入次數(shù)
    }

    public static void main(String[] args) {
        ThreadDemo1 demo1 = new ThreadDemo1();
        demo1.func1();
    }
}

public class ThreadDemo2 {
    //重入鎖
    static Lock LOCK = new  ReentrantLock();
    
    public void func1(){
        LOCK.lock();//獲得重如鎖
        //....
        LOCK.unlock();//釋放重入鎖
    }
}

4 讀寫鎖ReentrantReadWriteLock

  • 適用于讀多寫少的操作,例如緩存更新
  • 讀鎖&讀鎖->可重入
  • 讀鎖&寫鎖(寫鎖&讀鎖)->阻塞不可重入
public class ThreadDemo3 {
    //讀寫鎖
    static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();

    //讀鎖
    static  ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
    //寫鎖
    static  ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();
    //緩存
    static Map<String,Object> cache = new HashMap<String, Object>();

    /**
     * Description:根據(jù)key從緩存中獲取對象
     * @Param [key]
     * @return java.lang.Object
    **/

    public final Object getFromCache(String key){
        readLock.lock();//獲取'讀鎖'
        try {
            return cache.get(key);
        } finally {
            readLock.unlock();//釋放'讀鎖'
        }
    }

    /**
     * Description:向緩存中添加對象
     * @Param [key, value]
     * @return void
    **/

    public void putToCache(String key,final Object value){
        writeLock.lock();//獲取'寫鎖'
        try {
            cache.put(key,value);
        } finally {
            writeLock.unlock();//釋放'寫鎖'
        }
    }
}

5 AQS原理分析

  • 同步工具
    ReentrantLock 中AQS實(shí)現(xiàn)原理

ReentrantLock.Sync(內(nèi)部類).lock()
Sync有兩個子類
FairSync-公平鎖(不允許插隊(duì))
NonfairSync-非公平鎖(允許插隊(duì))
分別重寫了lock()方法

6 AQS源碼分析

6.1 ReentrantLock 獲取鎖LOCK.lock();//獲得重入鎖時序圖

image.png

6.1 ReentrantLock 獲取鎖LOCK.lock();//獲得重入鎖流程圖

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市以政,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖柳譬,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件志群,死亡現(xiàn)場離奇詭異相味,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)抹蚀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來企垦,“玉大人况鸣,你說我怎么就攤上這事≈窆郏” “怎么了镐捧?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長臭增。 經(jīng)常有香客問我懂酱,道長,這世上最難降的妖魔是什么誊抛? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任列牺,我火速辦了婚禮,結(jié)果婚禮上拗窃,老公的妹妹穿的比我還像新娘瞎领。我一直安慰自己泌辫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布九默。 她就那樣靜靜地躺著震放,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驼修。 梳的紋絲不亂的頭發(fā)上殿遂,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音乙各,去河邊找鬼墨礁。 笑死,一個胖子當(dāng)著我的面吹牛耳峦,可吹牛的內(nèi)容都是我干的恩静。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼蹲坷,長吁一口氣:“原來是場噩夢啊……” “哼蜕企!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冠句,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤轻掩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后懦底,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唇牧,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年聚唐,在試婚紗的時候發(fā)現(xiàn)自己被綠了丐重。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡杆查,死狀恐怖扮惦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亲桦,我是刑警寧澤崖蜜,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站客峭,受9級特大地震影響豫领,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舔琅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一等恐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦课蔬、人聲如沸囱稽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽战惊。三九已至,卻和暖如春同欠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背横缔。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工铺遂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茎刚。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓襟锐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親膛锭。 傳聞我的和親對象是個殘疾皇子粮坞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容