单例模式

定义:确保一个类只有一个实例,并提供一个全局访问点
类图

image.png

1、“懒汉式”

public class Singleton {
    private static Singleton uniqueInstance;
    private Singleton(){

    }

    public static Singleton getInstance(){
        if(uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }

}

在使用的时候创建,但线程不安全

2、“饿汉式”

public class Singleton {
    private static Singleton uniqueInstance = new Singleton();
    private Singleton(){

    }

    public static Singleton getInstance(){
        return uniqueInstance;
    }

}

此方法在JVM加载这个类的时候马上创建此唯一的单例。但线程安全。

3、加锁(不推荐)

public class Singleton {
    private static Singleton uniqueInstance;
    private Singleton(){

    }

    public static synchronized Singleton getInstance(){
        if(uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }

}

线程安全,但是一旦设置好uniqueInstance变量,就不需要同步这个方法了,以后每次调用这个方法,同步是一种累赘。

4、双重加锁

public class Singleton {
    private volatile static Singleton uniqueInstance;
    private Singleton(){

    }

    public static  Singleton getInstance(){
        if(uniqueInstance == null){
            synchronized(Singleton.class){
                if(uniqueInstance == null){
                    uniqueInstance = new Singleton();
                }
            }
            
        }
        return uniqueInstance;
    }

}


volatile 需要 java1.5及以上版本支持

你可能感兴趣的:(单例模式)