「这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战」
设计模式——单例模式(Singleton)
实现方式
同步锁
class Singleton {
private static Singleton ourInstance = null;
private Singleton() {
}
// 加入同步锁
public static synchronized Singleton getInstance(){
// 先判断单例是否为空,以避免重复创建
if ( ourInstance == null )
ourInstance = new Singleton();
return ourInstance;
}
}
复制代码
双检锁式
该方式是在懒汉式同步锁的基础上去改的。在同步锁的基础上再添加一层判断,如果单例对象已经创建,那么就不需要执行加锁操作获取实例.这种双锁的机制,安全且能够保持高性能。
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (this) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
复制代码
静态内部类
通过静态内部类去创建单例对象,在装载该内部类是才回去创建该单例对象
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
复制代码
当调用getInstance方法时,SingletonHolder会去初始化并初始化他的静态对象,进而会去Singleton单例对象。因为是经待遇,JVM只会去加载一遍,java虚拟机保证了线程的安全。
枚举
单元素的枚举类型已经成为实现 Singleton
的最佳方法,他满足了单例模式所有的需求,线程安全,实现简洁等。
public enum Singleton {
INSTANCE;
}
复制代码
总结
单例模式主要解决:一个全局类被频繁的使用和创建。
优点:
- 在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
- 避免对共享资源的多重占用。
缺点:
- 如果对象长时间不被利用,可能会被当做垃圾回收。