當一個類首先被加載時,每個JVM只會初始化一個java類。我認爲不止一個線程可以嘗試同時加載同一個類。 JVM如何處理這個爭用?是否有任何機制來防止它發生,比如鎖定?Jave如何防止發生併發類初始化?
1
A
回答
4
首先,下面的語句是不準確的:
一個Java類初始化每JVM只有一次
一個Java類每類裝載器初始化一次。一個JVM實例很可能有幾個類加載器,每個加載器分別加載相同的類。
爲了回答這個問題 - 是的,類加載器在加載類時必須加鎖。如果,例如,你看看的OpenJDK 9的實施java.lang.ClassLoader
,加載類最終將歸結爲以下方法(註釋添加到強調鎖定):
final Class<?> loadClass(Module module, String name) {
synchronized (getClassLoadingLock(name)) { // Note the locking here!
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);
if (c == null) {
c = findClass(module.getName(), name);
}
if (c != null && c.getModule() == module) {
return c;
} else {
return null;
}
}
}
+1
從一個JVM的觀點是,「幾個類加載器,每一個都分別加載相同的類」只是幾個定義*不同類的類加載器,即使它們可能具有相同的名稱或甚至相同的字節代碼。因此,語句「一個java類每個jvm只初始化一次」是正確和準確的。除此之外,引用的代碼只是實現類的*加載,而不是*初始化*。確保初始化只發生一次仍留給JVM。 – Holger
相關問題
- 1. 防止在初始化時觸發$ watchCollection
- 2. 在初始化時防止角度發生變化選擇框
- 3. 靜態類初始化何時發生?
- 4. 如何防止初始化元素的觸發器?
- 5. 如何防止Eclipse發生變化
- 6. 如何防止datepicker css發生變化
- 7. 微風:如何防止合併發生
- 8. 如何防止Go中導出類型的初始化?
- 9. 防止菜單高度發生變化?
- 10. 防止佈局方向發生變化
- 11. VM初始化時發生錯誤
- 12. Java:VM初始化期間發生錯誤
- 13. Java在「VM初始化期間發生」
- 14. 初始化時發生PhotoCamera問題
- 15. android map初始化時發生錯誤
- 16. 當靜態字段初始化發生?
- 17. 防止發生變量替換髮生
- 18. 當模塊初始化發生異常時會發生什麼
- 19. 如何初始化派生類的值?
- 20. 模板部分專業化可防止派生類的初始化
- 21. 如何防止事件發生?
- 22. 如何設置初始發生器值?
- 23. 防止HSQLDB來初始化數據庫
- 24. 防止靜態庫被初始化
- 25. 初始化變量一次,以防止
- 26. 如何防止併發效果執行
- 27. 如何防止併發的JavaScript執行?
- 28. HOWTO防止Tabchange發生
- 29. 如何防止觸摸時UIButton發生變化?
- 30. Apple如何防止屬性發生變化?
'一個Java類,每一次初始化一個jvm' - 那是不正確的。正確的語句應該是'一個java類每個類加載器只初始化一次' – rkosegi
http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.2 –