簡體   English   中英

一次有多少個線程可以訪問此Java對象的同步代碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM