// #.final修飾,避免子類繼承,覆蓋父類方法,破壞單例
public final class Singleton implements Serializable{
// #.私有構(gòu)造方法,避免被外面使用,但無法避免反射構(gòu)造實(shí)例
private Singleton(){}
// #.volatile修飾避免指令重排序,讀寫屏障
private static volatile Singleton instance;
public static Singleton getInstance(){
//#.第一個if判斷是否為空,不為空直接返回,避免synchronized同步代碼塊的執(zhí)行,多線程場景下頻繁加鎖會影響性能
if(instance == null){
// 首次訪問會同步,之后的使用沒有synchronized
synchronized (Singleton.class){
// #.第二個if判斷是否為空,當(dāng)a線程優(yōu)先獲得鎖,執(zhí)行到此處,b線程沒競爭到鎖會被阻塞在外面,a線程判斷實(shí)例是否為空,為空則new實(shí)例,a線程釋放鎖之后,b線程拿到鎖進(jìn)來后判斷instance是否為null,此時(shí)不為null,則釋放鎖往下
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
// 如果實(shí)現(xiàn)了序列化接口,加這個方法來防止反序列化破壞單例
public Object readResolve(){
return instance;
}
}
//來源:https://blog.csdn.net/qq_32088869/article/details/128027274?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522e642c041a9bc656f353a06a569d23212%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=e642c041a9bc656f353a06a569d23212&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-128027274-null-null.nonecase&utm_term=%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450