回答
它進入Foo.class
對象的監視器。如果另一個方法也在Foo.Class
上同步,則它將不得不等待,假設它在不同的線程中。
如果一個方法不同步它,那麼它將不受影響,不管它是否是靜態的。不是那些同步的靜態方法隱式地在它們被定義的類的類對象上同步。
它同步對使用它的方法/同步子句的訪問。這些可以是Bar類的方法 - 不一定是Foo。
重要的是,在「Foo.class」上同步的所有方法/同步子句不能同時執行。
同步完全不影響字段 - 無法聲明字段同步。
我對tutorial3210的解釋只會鎖定類的靜態成員。但要確定你需要寫一個測試。
public class SyncTest {
public static SyncTest instance;
public static String valueA;
public String valueB;
public static void main(String[] args) {
instance = new SyncTest();
(new Thread(new Task1())).start();
(new Thread(new Task2())).start();
try {
Thread.sleep(10000);
synchronized(SyncTest.class) {
System.out.println("Value A: " + valueA);
}
synchronized(instance) {
System.out.println("Value B: " + instance.valueB);
}
} catch (InterruptedException interrupt) { }
}
}
class Task1 implements Runnable {
public void run() {
try {
synchronized(SyncTest.class) {
System.out.println("Task 1 Sleeping ");
Thread.sleep(500);
SyncTest.valueA = "One";
System.out.println("T1 A: " + SyncTest.valueA);
}
synchronized(SyncTest.instance) {
Thread.sleep(1000);
SyncTest.instance.valueB = "Two";
System.out.println("T1 B: " + SyncTest.instance.valueB);
}
} catch (InterruptedException interrupt) { }
System.out.println("Task 1 Finished ");
}
}
class Task2 implements Runnable {
public void run() {
System.out.println("Task 2 Started");
try {
Thread.sleep(1000);
synchronized(SyncTest.class) {
SyncTest.instance.valueB = "Four";
System.out.println("T2 B: " + SyncTest.instance.valueB);
Thread.sleep(5000);
SyncTest.valueA = "Three";
System.out.println("T2 A: " + SyncTest.valueA);
}
} catch (InterruptedException interrupt) { }
System.out.println("Task 2 Finished");
}
}
這給輸出:
Task 1 Sleeping
Task 2 Started
T1 A: One
T2 B: Four
T1 B: Two
Task 1 Finished
T2 A: Three
Task 2 Finished
Value A: Three
Value B: Two
由於任務2更新valueB
而任務1持有實例鎖我認爲,這顯示靜態鎖不鎖類的所有實例。
它不鎖定任何成員。它根本不鎖定任何東西。它*在類對象上同步*。 – EJP
類對象的同步與實例的同步完全一樣。類如Foo.class
是一個對象,因此具有內置監視器。您提供的代碼:
synchronized(Foo.Class){
//some code..
}
同步訪問Foo類。嘗試同步類的靜態變量時可能很有用。例如:
public class Foo{
private static int COUNTER = 0;
synchronized public static void increment(){
COUNTER ++;
}
public static void decrement(){
synchronized (Foo.class) {
COUNTER ++;
}
}
}
正如你可以看到,可以實現相同的Foo.class
同步作爲任何實例。當試圖同步實例的代碼塊時,使用:synchronized(this){}
,在類對象的情況下相當於synchronized(Foo.class){}
。這同樣適用於同步方法的情況下:synchronized public void increment(){}
相當於:synchronized public static void increment(){}
現在關於你的問題:
這是否鎖定Foo類的所有實例或僅是靜態 方法/字段?
當然,它並不像上面解釋的那樣獲取所有實例的鎖。此外,類對象不知道創建的實例。 A塊不鎖定字段。它只鎖定一塊代碼/方法,它被獲取該鎖的線程強制作爲原子操作執行,並且沒有其他線程可以進入該代碼塊(但是如果它們不同步,則可以執行其他塊),直到第一個線程釋放該鎖(其在Java中是大括號的末尾}
)。
- 1. 參考Spring-Hibernate的「事務同步會話」是什麼意思?
- 2. 什麼時候是參考Rvalue參考?
- 3. 「System.Data.Entity.Infrastructure」的參考是什麼?
- 4. jQuery的$是什麼。參考?
- 5. 什麼是懸掛參考?
- 6. 什麼是JPA參考
- 7. WebServiceSecurity參考。它是什麼?
- 8. 什麼是跟蹤參考?
- 9. 什麼是參考指針?
- 10. 當我們可以做子類參考時,做超類參考有什麼好處
- 11. MIPS管道中的PCWrite&IFWrite是做什麼/參考的?
- 12. 參考循環神經網絡的時間步驟是什麼?
- 13. 什麼是參數的類型,這個函數做什麼?
- 14. JS異步庫中的回調參數是做什麼的?
- 15. 什麼是弱全球參考?它與全球參考文獻有何不同?
- 16. 什麼是git的廣告參考?
- 17. 什麼是java中的幻像參考
- 18. Extjs中的參考點是什麼?
- 19. 什麼是vscode中的參考路徑
- 20. 這是什麼意思的參考?
- 21. 什麼是Java中的參考?
- 22. 什麼是JavaScript中的「防衛參考」?
- 23. 什麼是同步 - 屬性?
- 24. 什麼是「同步點」?
- 25. 同步是什麼意思?
- 26. 什麼是做同步流視頻和文本的方法?
- 27. arguments_參考什麼?
- 28. 同步的「參考」或實例
- 29. TangoXYZij類中的深度數據的參考系統是什麼?
- 30. 爲什麼拳擊參考類型?
@Chandana - 錯誤。 –