眾所周知,單例模式主要就是將建構函式宣告為private,來防止外部呼叫例項化。**如下:
public
class
singleton
public
static singleton getinstance()
return uniqueinstance;
}}
這段邏輯,在單執行緒的程式中工作得很好。但是,當引入多執行緒時,就可能會出現問題。
示意圖如下:
示意圖使用synchroinzed關鍵字,使程式在執行時,同一時刻,只有乙個執行緒執行getinstance方法。
public
class
singleton
public
static
synchronized singleton getinstance()
return uniqueinstance;
}}
適用場景:
getinstance的效能對應用程式不是關鍵。因為這種方法會嚴重降低效能,而且只有第一次執行getinstance方法的時候,才需要同步。之後所有執行此方法時,都不需要同步鎖了。(個人覺得,用了synchronized後,只有在未初始化的時候,效能影響會比較大。之後所有執行次方法,只是直接返回例項了,所以對效能影響有限)
在應用程式宣告這個類的時候,就執行例項化。
public
class
singleton
public
static singleton getinstance()
}
適用場景:
如果應用程式總是建立並使用單例模式,或者在建立和執行時方面的負擔不太繁重。它是最簡單、最清楚的替代方法。
靜態初始化器如何保證例項只會被建立一次?
剛開始,我以為靜態方法在程式啟動時,會載入所有類的靜態初始化器,從而保證例項只會有乙個。
public
class
singleton
public
static singleton getinstance()
}public
class
main
}
這段程式實際的執行結果卻是:
main
create ins
原來,靜態初始化器是保證執行緒安全的。在每次載入類的時候才會去執行靜態初始化器。乙個類只會被載入一次,如果乙個類被載入了兩次,執行時類名就會衝突了。所以jvm會保證靜態初始化器是執行緒安全的。
首先檢查是否例項已經建立了,如果尚未建立,才進行同步。這樣一來,只有第一次會同步。
public
class
singleton
public
static singleton getinstance()
}}return uniqueinstance;
}}
volatilevolatile是輕量級的synchronized,它在多處理器開發中保證了共享變數的「可見性」。可見性的意思是當乙個執行緒修改乙個共享變數時,另外乙個執行緒能讀到這個修改的值。
public
class
singleton
public
static singleton getinstance()
}
適用場景:
處於效能的考慮而需要對靜態域使用延遲初始化。
眾所周知,單例模式主要就是將建構函式宣告為private,來防止外部呼叫例項化。**如下:
單例模式的五種方式
核心作用 保證乙個類只有乙個例項,並且提供了乙個訪問該例項的全域性訪問點。常見應用場景 單例模式的優點 常見的五種單例模式 主要其他 延遲載入 lazy load 也稱為懶載入。簡單來說,就是只有在使用的時候,才去呼叫或載入。是延遲載入。實現 懶漢式 單例模式 public class single...
單例模式的4種寫法
餓漢式 執行緒安全的,但是會一直占用記憶體 public class singletoninstance private static final singletoninstance instance new singletoninstance public static singletoninst...
單例模式併發
在研究單例模式的時候,為了保證單例的懶載入是同步的,我們通常會選擇乙個duoble check的方法來保證只有第一次才new物件。1.雙重檢測同步延遲載入 如下 關於volatile的作用在這裡就是保證在new出物件的那一立馬寫入主存,同時通知其他執行緒的他們的cache是無效的,這樣instanc...