本文介绍了单例模式并附有java代码实现demo。内容仅供参考使用,有不足之处请及时指出,也欢迎大家交流探讨。
单例模式
单例模式是创建型模式的一种,其保证了单例类只有一个实例对象。
单例模式特性
单例模式实现方式有多种,但其遵循以下3个特性。
-
单例类只能有一个实例对象。
-
该实例对象只能由单例类本身构建。
-
单例类必须向其他对象提供该实例对象。
懒汉式
public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo() {
}
public static synchronized SingletonDemo getInstance() {
if (null == instance) {
instance = new SingletonDemo();
}
return instance;
}
}
时间换空间,懒加载,用synchronized修饰保证了多线程安全,但也降低了效率。
饿汉式
public class SingletonDemo {
private static SingletonDemo instance = new SingletonDemo();
private SingletonDemo() {
}
public static SingletonDemo getInstance() {
return instance;
}
}
空间换时间,非懒加载,通过类加载机制保证了线程安全,没有使用synchronized,效率相对比要高一些。
双重检查加锁(DCL:Double-checked Locking)
public class SingletonDemo {
private volatile static SingletonDemo instance;
private SingletonDemo() {
}
public static SingletonDemo getInstance() {
if (null == instance) {
synchronized (SingletonDemo.class) {
if (null == instance) {
// 因为该操作非原子性,需用volatile修饰
instance = new SingletonDemo();
}
}
}
return instance;
}
}
时间换空间,懒加载,将synchronized由getInstance具体到对应的构建单例操作上,即保证了多线程安全,想对比懒汉式也提高了效率。
静态内部类
public class SingletonDemo {
private static class SingletonDemoHolder {
private static final SingletonDemo instance = new SingletonDemo();
}
private SingletonDemo() {
}
public static final SingletonDemo getInstance() {
return SingletonDemoHolder.instance;
}
}
时间换空间,懒加载,通过引入静态内部类,避免了SingletonDemo的加载导致instance的初始化,实现了懒加载,而且性能上相对比双重检查加锁有所提高。
网友评论