我有單例實作
public class Singleton {
private static volatile Singleton inst;
public static Singleton instOf() {
if (inst == null) {
synchronized (Singleton .class) {
if (inst == null) {
inst = new Singleton ();
}
}
}
return inst;
}
我不能完全理解“同步(Singleton.class)”是什么意思?如果只是同步(這個)呢?
uj5u.com熱心網友回復:
JVM 有一個監視器或其他稱為與類元資訊相關的內部標志,這些元資訊存盤在記憶體中的某個特定位置(permGen 或元空間)。在那個地方,存在一個監視器標志,并且與它自己的類相關,而不是與該類的某個實體相關。
synchronized (Singleton.class)將在 permgen 記憶體(jdk 8 之前)或元空間記憶體(jdk 8 及之后)中捕獲此標志。
JVM 還為每個存盤在堆中的類實體有一個單獨的監視器標志。
synchronized (this)this將捕獲呼叫該實體時指向的堆記憶體中特定實體的標志。
這些標志以相同的方式作業,但只是不同的標志。因此,只有 1 個執行緒需要捕獲該標志,其他執行緒應等待該標志被釋放,然后才能捕獲它并訪問代碼。如果您鎖定靜態標志或實體標志,則取決于您和您的要求,但概念是相同的。不是 2 個執行緒可以同時持有相同的標志。1 將阻塞并等待標志被釋放,然后才能訪問同步代碼。
注意:this在靜態方法中不起作用。在這種情況下,您只能使用與它自己的類相關的標志。您仍然可以在非靜態方法中使用這兩種型別的標志。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/450254.html
