1、大概
1.1 优点
- 减少系统内存开支,减少系统性能开销
- 由于在系统内存中只存在一个对象,因此可以节约系统资源,当需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能
- 避免对共享资源的多重占用、同时操作
1.2 缺点
- 单例模式中没有抽象层,所以单例类难以扩展
- 实例化的共享对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源,下次利用时又将从新实例化,这将致使共享的单例对象状态的丢失
- 单例类的职责太重,在必定程度上违背了“单一职责原则”。由于单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,耦合度太高
2、实现
2.1 饿汉式
public class Singleton {
private final static Singleton singleton = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return singleton;
}
}
2.2 懒汉式
2.2.1 双重判空加锁
public class Singleton {
private static volatile Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
- 线程安全,实现了懒加载,保证了线程同步时的效率
- 但是 volatile 强制当前线程每次读操作进行时,保证所有其他的线程的写操作已完成。volatile 使得 JVM 内部的编译器舍弃了编译时优化,对于性能有一定的影响
2.2.2 静态内部类
public class Singleton {
private Singleton() {
}
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return Singleton.SingletonHolder.instance;
}
}
- 线程安全
- 单例对象在程序第一次 getInstance() 时主动加载 SingletonHolder 和其静态成员 instance,实现了懒加载
|