天天看點

單例模式-->餓漢式+懶漢式一、概述1.餓漢式2.懶漢式

一、概述

單例模式:要求整個程式隻有一個對象
 *   三步驟: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;
    }
}           

複制