单例模式(单个实例)
instance 就是对象,整个进程中的某个类,有且只有一个对象(不会 new 出来多个对象),这样的对象就称为“单例”
如何保证这个类只有一个实例?
让编译器帮我们做一个强制的检查
饿汉模式
class Singleton {
private static Singletion instance = new Singletion ();
}
通过 getlnstance 来获取已经 new 好的 instance,而不需要重新 new
public static Singleton getInstace (){
return instance;
}
防止 new 一个新对象
private Singleton (){
}
饿汉模式是否安全?
创建实例的时机是在 Java 进程启动时
后续线程执行 getInstance 的时候上述实例早已经有了,每个线程的 getInstance 只做了一件事就是读取上述静态变量的值
属于多个线程度读取同一个变量
所以线程安全
懒汉模式
懒汉模式不是在程序启动的时候创建实例,而是在第一次使用的时候才去创建
private SingletonLazy(){}
啥时候调用 getInstance 就啥时候创建
如果不调用就不创建了
懒汉模式是否安全?
通过加锁的方式使懒汉模式也安全
要把 if 和 new 打包成原子操作
public static SingIetonLazy getInstance(){
synchronized (Locker){
if(instance ==null){
instance =new SingletonLazy();
}
}
return instance;
}