首先推薦種最好的單例模式實現方式(沒有之一)
public class Manager {
private Manager() {
}
public static Manager getInstance() {
return ManagerHolder.instance;
}
private static class ManagerHolder {
private static final Manager instance = new Manager();
}
}
然後解釋下爲什麼要用這種方式:
* 內部類只在需要的時候纔會被類加載器加載,實現了懶加載,即在需要的時候才實例化出一個Manager,而且是唯一的一個
* 同時由於instance是static final類型,保證了內存中只有這樣一個實例存在,而且只能被賦值一次,從而保證了線程安全性
(即使在高併發的情況下多個線程同時訪問getInstance()方法 也能夠保證實例的唯一性)
其他沒有采用內部類的實現方式 以下是目前見過最好的:
public static class SingletonOptimizeLazy {
static SingletonOptimizeLazy instance = null;
public static SingletonOptimizeLazy getInstance() {
if (instance == null) {
createInstance();
}
return instance;
}
private synchronized static SingletonOptimizeLazy createInstance() {
if (instance == null) {
instance = new SingletonOptimizeLazy();
}
return instance;
}
}
以上這種解決方式 主要思想是將實例化的過程抽象出來 放在一個sychronized方法中執行 這樣也能夠實現懶加載與併發安全
不過仍然推薦使用內部類的解決方案