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 指令,自然不會對執行的線程進行阻塞操作.或者說,第二個執行該方法的線程不會進行阻塞的操作