java內(nèi)置鎖synchronized的可重入性

當(dāng)線程請(qǐng)求一個(gè)由其它線程持有的對(duì)象鎖時(shí),該線程會(huì)阻塞,而當(dāng)線程請(qǐng)求由自己持有的對(duì)象鎖時(shí),如果該鎖是重入鎖,請(qǐng)求就會(huì)成功,否則阻塞。

java中獲取鎖的操作的粒度是“線程”,而不是“調(diào)用”,即不是每一次調(diào)用都是建立一個(gè)鎖。

重入鎖的一種實(shí)現(xiàn)方法是為每個(gè)鎖關(guān)聯(lián)一個(gè)線程持有者和計(jì)數(shù)器,當(dāng)計(jì)數(shù)器為0時(shí)表示該鎖沒有被任何線程持有,那么任何線程都可能獲得該鎖而調(diào)用相應(yīng)的方法;當(dāng)某一線程請(qǐng)求成功后,JVM會(huì)記下鎖的持有線程,并且將計(jì)數(shù)器置為1;此時(shí)其它線程請(qǐng)求該鎖,則必須等待;而如果同一個(gè)線程再次請(qǐng)求這個(gè)鎖,就可以再次拿到這個(gè)鎖,同時(shí)計(jì)數(shù)器會(huì)遞增;當(dāng)線程退出同步代碼塊時(shí),計(jì)數(shù)器會(huì)遞減,如果計(jì)數(shù)器為0,則釋放該鎖。

看下面的例子,正是由于java的內(nèi)置鎖是可重入的,所以下面這段代碼不會(huì)發(fā)生死鎖:

public class Child extends Father{
    public static void main(String[] args) {
        new Child().doSomething();
        
    }
    
    public synchronized void doSomething(){
        System.out.println("child");
        super.doSomething();
    }
 
}
 
class Father{
    public synchronized void doSomething(){
        System.out.println("Father");
    }
}

輸出結(jié)果:
child
Father

重入的錯(cuò)誤理解:

一本正經(jīng)的胡說八道
例子解釋有問題,不存在父類的鎖或者子類的鎖,鎖是加在實(shí)例上的不是類上
原文鏈接

正確理解:


知乎問題鏈接

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

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

  • 本文是我自己在秋招復(fù)習(xí)時(shí)的讀書筆記,整理的知識(shí)點(diǎn),也是為了防止忘記,尊重勞動(dòng)成果,轉(zhuǎn)載注明出處哦!如果你也喜歡,那...
    波波波先森閱讀 11,627評(píng)論 4 56
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,260評(píng)論 8 265
  • 1.解決信號(hào)量丟失和假喚醒 public class MyWaitNotify3{ MonitorObject m...
    Q羅閱讀 1,015評(píng)論 0 1
  • Java繼承關(guān)系初始化順序 父類的靜態(tài)變量-->父類的靜態(tài)代碼塊-->子類的靜態(tài)變量-->子類的靜態(tài)代碼快-->父...
    第六象限閱讀 2,255評(píng)論 0 9
  • 怎么也沒想到,會(huì)嫁給他;怎么也沒想到,會(huì)愛上他;怎么也沒想到,冥冥之中,他騙了她…… “ 原來一切,都是假的…”...
    綺語諳閱讀 369評(píng)論 0 0

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