1. 程式人生 > >單例模式--餓漢、懶漢、多線程以及多線程下改進

單例模式--餓漢、懶漢、多線程以及多線程下改進

desc 懶漢 http ret locker syn bubuko 線程 info

代碼註釋有介紹

package singleton;

/**
 * @author: ycz
 * @date: 2018/12/24 0024 22:15
 * @description: 懶漢模式
 */
public class SingleTon1 {
    public SingleTon1(){}
    private static SingleTon1 instance1 = null;

    public static SingleTon1 getInstance1(){
        if (instance1==null){
            instance1 = new
SingleTon1(); } return instance1; } }
package singleton;

/**
 * @author: ycz
 * @date: 2018/12/24 0024 22:21
 * @description: 餓漢模式
 */
public class SingleTon2
{
    private SingleTon2(){}
    private static final SingleTon2 instance2 = new SingleTon2();

    public static SingleTon2 getInstance2(){
        
return instance2; } }
package singleton;

/**
 * @author: ycz
 * @date: 2018/12/24 0024 22:32
 * @description: 解決多線程問題(在創建單例時加鎖)
 */
public class SingleTon3 {
    private SingleTon3(){}
    private static SingleTon3 instance3 = null;
    public static synchronized SingleTon3 getInstance3(){
        if
(instance3 == null){ instance3 = new SingleTon3(); } return instance3; } }
package singleton;

/**
 * @author: ycz
 * @date: 2018/12/24 0024 22:36
 * @description: 在方法上加鎖效率低下;可以先判斷是否有創建過單例,如果沒有在加鎖創建
 */
public class SingleTon4 {

    private SingleTon4(){}

    private static final Object myLocker = new Object();

    private static SingleTon4 instance4 = null;

    public static SingleTon4 getInstance4(){
        if (instance4 == null){
            synchronized (myLocker){
                instance4 = new SingleTon4();
            }
        }
        return instance4;
    }
}

這是SingleTon1(餓漢式)時會出現的問題。

技術分享圖片

單例模式--餓漢、懶漢、多線程以及多線程下改進