美文网首页
java线程安全单例模式实现

java线程安全单例模式实现

作者: tanbin_tech | 来源:发表于2020-02-23 11:05 被阅读0次

    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方法的时候才会初始化这个内部类

    相关文章

      网友评论

          本文标题:java线程安全单例模式实现

          本文链接:https://www.haomeiwen.com/subject/pnidqhtx.html