当前位置 > it书童 > java > 正文

单例模式-懒汉式实现

java it书童 2020-12-26 18:03:12 0赞 0踩 77阅读 0评论

什么是单例模式

定义:保证一个类仅有一个实例,并提供一个全局访问点

优点:

  • 在内存里只有一个实例,减少了内存开销

  • 可以避免对资源的多重占用

  • 设置全局访问点,严格控制访问

缺点:

  • 没有接口,扩展困难

重点:

  • 私有构造器

  • 线程安全

  • 延迟加载

  • 序列化与反序列化安全

  • 反射

懒汉式与多线程 debug

懒汉注重的是延迟加载,用到类时才去加载类

public class LazySingleton {
    private static LazySingleton lazySingleton = null;
    // 为了不让外部类 new 对象,无参构造方法设置为 private
    private LazySingleton() {
    }

    public static LazySingleton getInstance() {
        if (lazySingleton == null) {
            lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }
}

这种方式看似简单,实际上是线程不安全的,单线程是安全的,多线程时会出现 new 两次的概率

用 idea 使用多线程调试

多个线程如果创建多个单例对象,而这个对象又很消耗资源,就可能造成系统故障,如内存溢出

解决方案:加锁即可

// 在静态方法中加锁,相当于锁了这个类
public synchronized static LazySingleton getInstance() {
    if (lazySingleton == null) {
        lazySingleton = new LazySingleton();
    }
    return lazySingleton;
}

此时,当现有线程已经拿到锁,再切换线程要拿锁时,就提示必须等待

虽然能实现线程安全,不过同步锁比较消耗资源,每次获取对象都要经过同步锁,对性能有影响

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/1008