java线程安全单例模式实现

Enum关键字实现

public Enum EnumSingleton {
INSTANCE
}

是最简单的实现

类加载的时候就实例化

public class EarlyInitSingleton{
    private final static EarlyInitSingleton earlyInitSingleton = new EarlyInitSingleton();
    
    public EarlyInitSingleton getInstance() {
        return earlyInitSingleton;
    }
}

在类加载的时候就已经初始化了,简单省事的,唯一就是会造成空间浪费,因为都还没用就已经占位置了,不过,这点内存实际上来说不大。

双重验证

public class DoubleCheckSingleton{
   private static volatile DoubleCheckSingleton instance;
   
   public static DoubleCheckSingleton getInstance() {
       if(instance == null) {
           synchronized(DoubleCheckSingleton.class) {
               if(instance == null) {
                   instance = new DoubleCheckSingleton();
               }
           }
       }
       return instance;
   }
}
缺点:
  • volatile关键字只有在java1.4之后才支持(基本不是什么大问题)
  • 可读性非常差
  • 必须使用volatile是因为保证内存可见性,不然,B线程使用本地的缓存,而A线程已经更新变量,B没看到,就会继续创建一个新实例

使用内部静态类实现懒加载

public class LazyInitInstance {
    private static class B {
        private final static LazyInitInstance INSTANCE = new LazyInitInstance();
    }
    
    public static LazyInitInstance getInstance() {
        return B.instance;
    }
}

第一次调用getInstance方法的时候才会初始化这个内部类

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容