三种单例模式
1.懒汉式(饱汉式)单例模式
package com.lanou.singleton;
//懒汉(饱汉)模式
public class LazySinglton {
private static LazySinglton instance;
private LazySinglton() {
}
public static LazySinglton getInstance() {
if(instance==null) {
instance=new LazySinglton();
}
return instance;
}
}
2.饿汉式单例模式
package com.lanou.singleton;
//饿汉模式
public class Hungrysingleton {
private Hungrysingleton() {
}
private static Hungrysingleton instance = new Hungrysingleton();
public static Hungrysingleton getInsatance() {
return instance;
}
}
3.双重检查锁的单例模式
package com.lanou.singleton;
//双重检查锁的单例模式
public class DoubleCheckSingleton {
private DoubleCheckSingleton() {
}
private static DoubleCheckSingleton instance;
public static DoubleCheckSingleton getInstance() {
if(instance==null) { //第一重检查:检查对象是否存在
synchronized (instance) {
if (instance == null) { //第二重检查:对象不存在的情况下,保证创建对象时线程安全
instance = new DoubleCheckSingleton();
}
}
}
return instance;
}
}
三种模式的比较:
①懒汉式单例模式,
优点:设计也是比较简单的,和饿汉式不同,当这个Singleton被加载的时候,被static修饰的静态变量将会被初始化为null,这个时候并不会占用内存,而是当第一次调用getInstance方法的时候才会被初始化实例对象,很显然,这种方式是按需创建。
缺点:在单线程环境下是没有问题的,在多线程环境下,会产生线程安全问题。
②饿汉式单例模式:
优点:设计简单,不存在多线程安全问题。
缺点:当Singleton类被加载的时候,静态代码就会被初始化,那么就意味会去创建实例对象并且分配内存空间,那么之后呢,不管这个实例对象用不用,都会占据内存空间。当我们将一个很大的对象通过饿汉式的方式去设计的时候,显然是不太合适的。
③双重检查锁的单例模式
优点:效率高,线程安全。
缺点:第一次创建对象的时候,速度慢。