单例设计模式特点
单例(Singleton)模式的定义:指类的实例化对象只有一个,对外关闭实例化入口,只提供一个实例化对象获取入口。
- 单例模式类的实例化对象只有一个并且由自己创建;
- 减少内存开销和资源的过多占用;
- 单例模式类对所有其他对象提供同一实例。
饿汉式单例模式
饿汉式单例模式,在编译期间就立即加载类的实例化对象,无论有没有使用,这个实例化对象已经创建了。
public class Hungry {
// 构造器私有化
private Hungry(){
}
// 静态方法实例化
private static final Hungry instance= new Hungry();
//对外提供实例化对象获取
public static Hungry getInstance(){
return instance;
}
}
饿汉式优点:
无多线程同步问题,实现简单
缺点:
在加载的时候就创建,如果不用这个类,就会一直占用静态内存空间
懒汉式单例模式
懒汉式分为线程安全和线程不安全两种
线程不安全懒汉式
public class Lazy {
// 私有化构造方法
private Lazy(){
}
private static Lazy instance = null;
public static Lazy getInstance(){
if(instance == null){
instance = new Lazy();
}
return instance;
}
}
线程安全懒汉式分两种实现方式,一种使用关键字synchronized对geyInstance()方法加锁,比较简单就不给出代码,另一种是使用双重检查机制(DCL:double checked locking)
public class Lazy {
// 私有化构造方法
private Lazy(){
}
private volatile static Lazy instance = null;
public static Lazy getInstance(){
// 第一次判断对象是否被实例化
if(instance == null){
// 未被实例化,取得锁
synchronized (Lazy.class){
if(instane == null){
// 再次判断是否被实例化
instance = new Lazy();
}
}
}
return instance;
}
}
懒汉式实现起来比较简单,只有在加载的时候才分配内存,一定程度上节省空间。