[英]How many threads may have access to the synchronized code of this Java object at any one time?
假設下面的類:
public class MyClass {
public synchronized void methodA() {
//...code
}
public synchronized void methodB() {
//...code
}
public synchronized void methodC() {
//...code
}
}
假定MyClass的所有同步方法都不相互調用。
我是否正確地假設1,並且在任何給定時間只有1個線程可以訪問MyClass的任何代碼? 例如,如果某個線程正在MyClass的實例上執行methodA(),則我認為此時沒有其他線程可以調用methodB()或methodC(),但是將阻塞直到該線程執行methodA()為止。第一線程完成。
我想澄清一下我對Java並發實踐Goetz(28)的理解,他指出:
“獲取與對象相關聯的鎖不會阻止其他線程訪問該對象,獲取鎖會阻止其他任何線程執行的唯一操作就是獲取相同的鎖。”
我認為在這種特殊情況下,Goetz的第一句話是不正確的。 MyClass在其3個方法中的每個方法上都使用隱式鎖定-對於每個方法,隱式鎖定本身就是( this )。 因此,在這種情況下,如果線程在執行methodA()時持有隱式鎖,則將阻止所有其他線程訪問此對象上的任何代碼。
我是否正確理解方法同步和隱式鎖定?
任何觀點都將不勝感激!
“獲取與對象相關聯的鎖不會阻止其他線程訪問該對象,獲取鎖會阻止其他任何線程執行的唯一操作就是獲取相同的鎖。”
您的三個方法都聲明為已synchronized
。 當這些方法之一被調用時,例如
MyClass instance = new MyClass();
instance.methodA();
當前正在執行的線程(稱為A)將獲取該實例的監視器。 除非A釋放了其他對象,否則其他線程將無法獲取該對象的監視器。 沒有什么可以阻止其他線程在同一對象上調用方法。
假設您有線程A在做
instance.methodA();
和線程B做
instance.methodB();
然后,是的,線程B將不得不等待methodA
完成(即,線程A釋放instance
引用的對象上的鎖)。
但是,如果線程A在做
instance.methodA();
而線程B在做
instance.toString();
線程B完全不必等待,因為toString()
對對象的監視器不執行任何操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.