一、概述
單例模式:要求整個程式隻有一個對象
* 三步驟:1.私有化構造方法
* 2.在類的内部建立一個對象
* 3.通過公開的方法,傳回這個對象
複制
1.餓漢式
/*
*餓漢式:類一加載,對象就初始化
* 缺點:生命周期太長,浪費空間
* 優點:線程安全
* /
public class SingleTon2 {
//私有化構造方法
private SingleTon2(){};
//私有化對象
private static SingleTon2 instance = null;
//公開方法傳回對象
public static synchronized SingleTon2 getInstance(){
if(instance == null){
instance = new SingleTon2();
}
return instance;
}
}
複制
2.懶漢式
懶漢式,使用時建立,線程不安全,加同步
public class SingleTon {
//1.私有構造方法
private SingleTon(){}
//2.在類的内部建立一個對象
private static SingleTon instance;
// 3.通過公開的方法,傳回這個對象
public static SingleTon getInstance(){
if(instance==null){
instance = new SingleTon();
}
return instance;
}
}
複制
懶漢式,優化
/*
好處:生命周期短,節省空間 缺點:線程不安全,必須使用同步解決
*/
public class SingleTon2 {
//(1)私有化構造方法
private static boolean flag=false;
private SingleTon2(){
if(flag){
throw new RuntimeException("不能反射破解");
}
}
//(2)在類内部建立一個對象
private static volatile SingleTon2 instance;
//(3)通過公開的方法,傳回這個對象
public static SingleTon2 getInstance(){
//判斷鎖是否可用效率低
if(instance==null) {//目的:提高效率, double check雙重檢查
synchronized (SingleTon2.class) {
if (instance == null) {
//(1)new (2)dup (3)invokespecial (4)astore
// 1 2 3 4
// 1 2 4 3 多線程問題?
instance = new SingleTon2();
flag=true;
}
}
}
return instance;
}
}
複制