高併發學習3

monitor

上一篇文章

敘述了monitor 是syncxxx的底層原理實現. 而且敘述了對象頭對monitor 的影響.
可以說,對象頭是 🔒的核心.

多方法

對於一個A類的實例,有倆個方法:
方法A和方法B.
方法A加了🔒
方法B沒有加🔒
@Test
    public void B(){
        // 這裏的🔒鎖的是自身
        count--;
        System.out.println(Thread.currentThread().getName() + "count==" + count);
    }
    @Test
    public void A(){
        // 這裏的🔒鎖的是自身
        synchronized (Object.class){
            count--;
            System.out.println(Thread.currentThread().getName() + "count==" + count);
        }
    }
那麼,我們在訪問方法B的時候會阻塞嗎??
雖然我不知道正確答案.但本能促使我回答,方法B.但是,爲什麼呢???

我們這麼想.每次線程去執行一個方法的時候,無論這個方法是不是同步的,都是線程安全的.
那麼在訪問阻塞方法的時候,在字節碼層面,遇到了 被同步的方法,會書寫 entermonitor 指令, monitor 的值就會+1.
那麼,下一個線程到來時,除非monitor 的值爲0,纔會進去執行,否則是不會進去執行的.
而,另一個方法呢,則不會遇到entermonitor 指令,自然不會對執行的線程進行阻塞操作.或者說,第二個執行該方法的線程不會進行阻塞的操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章