单利模式特别常用的模式之一,好处是保证一个类中只有一个实例,减少资源消耗.
单利模式分为懒汉式和饿汉式.
先来看懒汉式,所谓懒汉式,就是延迟加载,需要时才创建对象,先来看代码
class Singleton {
//私有静态实例
private static Singleton instance = null;
//私有构造方法,防止被实例化
private Singleton(){}
public static Singleton getInstance(){
if (instance==null) {
instance = new Singleton();
}
return instance;
}
}
这段代码在项目中很常见,当然,在单线程中使用时没有问题的,但遇到了多线程就会存在隐患,会出现线程不安全,这时就需要加同步锁了
class Singleton {
//私有静态实例
private static Singleton instance = null;
//私有构造方法,防止被实例化
private Singleton(){}
public static Singleton getInstance(){
if (instance==null) {
synchronized (Singleton.class) {
if (instance==null) {
instance = new Singleton();
}
}
}
return instance;
}
}
那么问题来了,为什么需要两次判空呢?
因为可能会有多个线程一起进入同步块外的 if,如果在同步块内不进行二次检验的话就会生成多个实例了。
下面来看饿汉式,饿汉式就是一上来就直接创建对象,并且实例被static和final,所以创建线程实例本身就是安全的,下面上代码
class Singleton {
//类加载时直接初始化
private static Singleton instance = new Singleton();
//私有构造方法
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}