回答
通常,方法用於保護對同時訪問的資源的訪問。當同時訪問的資源屬於您的類的每個實例時,您使用實例方法;當資源屬於所有實例時(即,當它位於static
變量中)時,則使用synchronized static
方法來訪問它。
例如,您可以製作一個工廠方法,該工廠方法可以保存其生成的所有對象的「註冊表」。這種註冊的自然地點將是一個static
集合。如果您的工廠在多個線程中使用,則需要使工廠方法(或在方法內部具有塊)來保護對共享static
集合的訪問。
請注意,使用而沒有特定的鎖對象時,通常不是最安全的選擇,因爲當您構建要在其他人編寫的代碼中使用的庫時。這是因爲惡意代碼可能會在您的對象或類上同步以阻止自己的方法執行。爲了保護你的代碼不受這個影響,創建一個私有的「鎖定」對象,實例或靜態對象,並在該對象上進行同步。
謝謝,@dasblinkenlight爲這樣的用戶回答,尤其是在您的圖書館中使用私人鎖定對象的指導。 –
簡而言之,static synchronized
方法將鎖定類而不是對象,並且它將鎖定類,因爲關鍵字static
表示:「class instead of instance」。
關鍵字表示一次只有一個線程可以訪問該方法。
而static synchronized
意味着:
只有一個可以同時訪問類。
另請參閱更多詳細信息 - http://www.javatpoint.com/static-synchronization-example – amar
最好的只有4行:) – roottraveller
在運行時,每個類都有一個Class
對象的實例。這是由static synchronized
方法鎖定的對象。 (任何同步的方法或塊必須鎖定一些對象。)
如果需要(無論是否在靜態方法中),還可以手動同步此對象。這兩種方法的行爲相同:
class Foo {
static synchronized void methodA() {
// ...
}
static void methodB() {
synchronized (Foo.class) {
// ...
}
}
}
Hats off ...這個話題不是很清楚util我看過你的答案。即使是java doc也沒有像你那樣看起來像..... –
- 1. Java - 同步靜態方法
- 2. java靜態同步方法
- 3. 什麼是靜態方法同步嗎?
- 4. 當在同步方法或java中使用靜態成員
- 5. 靜態同步方法與非靜態同步方法
- 6. 爲什麼你不能在Java中使用相同方法簽名的靜態和非靜態方法?
- 7. 同步靜態方法
- 8. 靜態同步方法
- 9. Java的同步,並通過多線程使用靜態同步方法
- 10. 在Java中使用靜態方法和實例方法的方式有什麼不同。
- 11. 訪問靜態字段的Java同步和靜態同步方法
- 12. 在以下語法中使用方括號「[]」有什麼用途
- 13. 在IValueConverter接口中使用ConvertBack方法有什麼用途?
- 14. 關於靜態和非靜態方法的Java同步
- 15. 爲什麼Java在拋出java.lang.IllegalMonitorStateException時以靜態方式調用wait()同步塊?
- 16. 在Java中,不使用靜態或類變量的方法需要同步嗎?
- 17. 靜態同步方法vs靜態方法,所有代碼都在同步塊中
- 18. 同步靜態方法在Java中如何工作?
- 19. 如何在Java中同步靜態方法
- 20. 靜態方法和非靜態方法有什麼區別?
- 21. 具有靜態方法的靜態類和具有靜態方法的常規類之間有什麼不同?
- 22. 調用靜態方法在Java中
- 23. 在java中調用非靜態方法
- 24. 線程中的靜態同步和非靜態同步方法行爲差異
- 25. java中的靜態方法可以調用非靜態方法
- 26. 爲什麼靜態最終變量使用靜態方法初始化需要同步?
- 27. Java中的ByteBuffer有什麼用途?
- 28. java中的hypen( - )有什麼用途
- 29. 爲什麼允許靜態方法調用私有方法?
- 30. 爲什麼在Java中調用靜態方法沒有被創建?
任何「同步」的方法或塊上的條目,使得僅一次一個線程可以執行該方法/塊(相對於鎖定對象)「鎖定」。此外,一次只能有一個線程執行*鎖定在同一個對象上的任何*方法/塊。一個靜態同步方法被鎖定在Class對象上。 –
@Zavior我不認爲它是重複的 - 你所關聯的問題是關於「它是如何完成的」,而這個問題是關於「爲什麼這樣做」。 – dasblinkenlight
@dasblinkenlight我認爲你是對的 – Zavior