单例模式能保证某个类在程序中只存在唯一一份实例, 而不会创建出多个实例单例模式具体的实现方式, 分成 "饿汉" 和 "懒汉" 两种.
饿汉(天然就是安全的 只是读操作)
//单例模式(饿汉)
//天然就是安全的 只是读操作
// 把单例这个类设置成的
class Singleton {
// 唯一实例的本体
private static Singleton instance = new Singleton();
// 获取到实例的方法
public static Singleton getInstance() {
return instance;
}
//禁止外部 new 实例 此处 在类的内部把实例创建好同时禁止外部重新创建实例 此时就保证单例的特性了
// private是类外部不能用
private Singleton() { }
}
public class ThreadDemo15 {
public static void main(String[] args) {
// 此时 s1 和s2 是同一个对象
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
}
}
懒汉(不安全的 有读有写)
//通过懒汉模式实现单例模式
//不安全的 有读有写
//如何保证安全?
//1.加锁 把if和new变成原子操作
//2.双重if,减少不必要的加锁操作
//3.使用volatile 禁止指令重排序,保证后续线程肯定拿到的是完整对象
class SingletonLazy {
private static SingletonLazy instance = null;
public static SingletonLazy getInstance() {
//这个条件,判定是否要加锁,此时如果对象已经有了,就不必加锁了此时本身就是线程安全了
if(instance == null) {
synchronized (SingletonLazy.class) {
if (instance == null) {
instance = new SingletonLazy();
}
}
}
return instance;
}
private SingletonLazy() { }
}
public class ThreadDemo16 {
public static void main(String[] args) {
SingletonLazy s1 = SingletonLazy.getInstance();
SingletonLazy s2 = SingletonLazy.getInstance();
System.out.println(s1==s2);
}
}