相關概念
立即加載/餓漢模式使用類的時候已將對象創建完畢,常見的實現辦法就是直接new實例化
private static MyObject myObject = new MyObject();
public static MyObject getInstance() {
//沒有synchronized,可能出現非線程安全問題
return myObject
}
延遲加載/懶漢模式什麼時候用什麼時候創建
private static MyObject myObject;
public static MyObject getInstance() {
//沒有synchronized,可能創建N個對象
if (myObject == null)
myObject = new MyObject();
return myObject;
}
多線程下的單例解決方案
懶漢模式 聲明getInstance()方法synchronized缺點:效率低下
懶漢模式 DCL雙檢查鎖private volatile static MyObject myObject;
public static MyObject getInstance() {
try{
if (myObject != null){
} else {
//模擬一些耗時的準備工作
Thread.sleep(3000);
synchronized(MyObject.class) {
if (myObject == null) {
myObject = new MyObject();
}
}
}
} catch (InterruptedException e){
e.printStackTrace();
}
return myObject;
}
靜態內置類public class MyObject {
private static class MyObjectHandler {
private static MyObject myObject = new MyObject();
}
private MyObject();
public static MyObject getInstance() {
return MyObjectHandler.myObject;
}
}
註:反序列化時使用(實現)Serializable.readResolve()方法,它將不「複製」新對象而遵循單例規則
靜態代碼塊private static MyObject instance = null;
static {
instance = new MyObject();
}
enum枚舉類型與靜態代碼塊相似,在使用枚舉類時,構造方法會被自動調用
public enum MyObject {
private Connection connection;
private MyObject() {
//...
connection = .....;
}
public Connection getConnection() {
return connection;
}
}