Java 单例模式

饿汉式

/**
 * 单例模式(饿汉式 - 类加载时主动创建实例)
 * Created by Sheldon on 2019/10/26.
 * Project Name: alstudy.
 * Package Name: test2.
 */
public class Singleton {

    // 静态初始化中创建单例实例,保证线程安全
    private static Singleton uniqueInstance = new Singleton();
    // 限制用户,使用户无法通过new方法创建对象
    private Singleton(){}
    public static Singleton getInstance(){
        return uniqueInstance;
    }
}

懒汉式

  1. 线程不安全
/**
 * 单例模式(懒汉式 - 检测到没实例时才创建实例)
 * Created by Sheldon on 2019/10/26.
 * Project Name: alstudy.
 * Package Name: test2.
 */
public class Singleton {
    
    private static Singleton uniqueInstance;
    // 限制用户,使用户无法通过new方法创建对象
    private Singleton(){}
    public static Singleton getInstance(){
        // 判断当前单例是否已创建,存在就返回,否则就创建后返回
        if (uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}
  1. 线程安全
    (在对应方法内使用synchronized关键字即可)
synchronized public static Singleton getInstance(){
        // 判断当前单例是否已创建,存在就返回,否则就创建后返回
        if (uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
  1. 双重检查加锁版
    (首先检查是否实例已经创建,如果尚未创建,“才”进行同步。这样以来,只有一次同步,这正是我们想要的效果。)
/**
 * 单例模式(懒汉式)
 * Created by Sheldon on 2019/10/26.
 * Project Name: alstudy.
 * Package Name: test2.
 */
public class Singleton {

    volatile private static Singleton uniqueInstance;
    // 限制用户,使用户无法通过new方法创建对象
    private Singleton(){}
    public static Singleton getInstance(){
        // 判断当前单例是否已创建,存在就返回,否则就创建后返回
        if (uniqueInstance == null){
            synchronized (Singleton.class){
                if (uniqueInstance == null){
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}
  1. 登记式/内部静态类方式
    (静态内部实现的单例是懒加载的且线程安全。)
    通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance,意味着只有第一次使用这个单例的实例的时候才加载,同时不会有线程安全问题。
/**
 * 单例模式(懒汉式 - 登记式/静态内部类方式)
 * Created by Sheldon on 2019/10/26.
 * Project Name: alstudy.
 * Package Name: test2.
 */
public class Singleton {

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    private Singleton (){}
    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

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