23种设计模式——单例模式
- 单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些频繁创建销毁的对象,使用单例模式可以提高系统性能;
- 当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不new;
- 单例模式的使用场景:相应频繁创建和销毁的对象,创建对象时耗时过多或者耗费资源过多(重量级对象),但有经常用到的对象,工具类对象,频繁访问数据库和文件的对象(如:数据源,session工厂等).
1. 懒汉式(双重检查)
线程安全,延迟加载,效率较高
public class LazyLoadSingleTon {
// 私有化构造器
private LazyLoadSingleTon(){}
// 提供唯一实例
private static LazyLoadSingleTon lazyLoadSingleton;
// 提供获取方法:双重锁, 保证线程安全
public static LazyLoadSingleTon getInstance(){
if(lazyLoadSingleton==null){
synchronized (LazyLoadSingleTon.class){
if(lazyLoadSingleton==null){
lazyLoadSingleton=new LazyLoadSingleTon();
}
}
}
return lazyLoadSingleton;
}
}
2. 枚举
借助JDK1.5中添加的的枚举来实现的单例模式,不仅能避免多线程同步问题,而且还能防止反复重新创建对象
public enum EnumSingleTon {
INSTANCE;
}
3. 饿汉式(静态常量)
优点:
这种写法比较简单,就是在类装载的时候完成实例化,避免线程同步的问题。
缺点:
(1) 在类装载的时候完成实例化,没有达到Lzay Loading的效果,如果自始至终都没有用过这个实例,就会造成内存浪费。
(2) 这种方式基于classloder机制避免了多线程同步的问题,不过instance在类装载的时候就实例化了,在单例模式中大多都是调用instance方法,但是导致内装载的原因有很多种,因此不能确定有其他方法导致类装载,这个时候初始化就是饿汉式的。
结论: 这种单例模式可用,但可能造成内存浪费
public class ActiveLoadSingleTon {
private ActiveLoadSingleTon(){}
private static final ActiveLoadSingleTon INSTANCE=new ActiveLoadSingleTon();
public static ActiveLoadSingleTon getInstance(){
return INSTANCE;
}
}
4. 单元测试
class SingletonTest {
@Test
public void test_getInstance_when_lazyLoad() {
LazyLoadSingleTon lazyLoadSingleton1= LazyLoadSingleTon.getInstance();
LazyLoadSingleTon lazyLoadSingleton2= LazyLoadSingleTon.getInstance();
Assert.isTrue(lazyLoadSingleton1==lazyLoadSingleton2);
}
@Test
public void test_getInstance_when_activeLoad() {
ActiveLoadSingleTon activeLoadSingleTon1 = ActiveLoadSingleTon.getInstance();
ActiveLoadSingleTon activeLoadSingleTon2 = ActiveLoadSingleTon.getInstance();
Assert.isTrue(activeLoadSingleTon1 == activeLoadSingleTon2);
}
@Test
public void test_getInstance_when_enumLoad() {
EnumSingleTon enumSingleTon1 = EnumSingleTon.INSTANCE;
EnumSingleTon enumSingleTon2 = EnumSingleTon.INSTANCE;
Assert.isTrue(enumSingleTon1 == enumSingleTon2);
}
}
参考链接:
(1) https://blog.csdn.net/fyj13925475957/article/details/103287327