美文网首页
总结复写一下java 单例的各种写法6种

总结复写一下java 单例的各种写法6种

作者: 陈沉成染 | 来源:发表于2019-07-31 23:33 被阅读0次

    普通写法(饿汉式)

    public class Single {
        private static final Single INSTANCE = new Single();
        public static Single getINSTANCE() {
            return INSTANCE;
        }
    }
    // 线程安全 因为类加载的时候就直接加载了 所以是线程安全的
    

    懒汉式

    public class Single {
        private static  Single INSTANCE = null;
        public static Single getINSTANCE() {
            if (INSTANCE == null){
                INSTANCE = new Single();    
            }
            return INSTANCE;
        }
        //最基础的写法 非线程安全
    }
    

    升级一点的写法

    public class Single {
        private static  Single INSTANCE = null;
        public static synchronized Single getINSTANCE() {
            if (INSTANCE == null){
                INSTANCE = new Single();
            }
            return INSTANCE;
        }
        //线程安全 ,但是效率降低
    }
    

    再升级一点的写法

    public class Single {
        private static volatile Single INSTANCE = null;
        public static Single getINSTANCE() {
            if (INSTANCE == null){
                synchronized (Single.class){
                    if (INSTANCE == null){
                        INSTANCE = new Single();
                    }
                }
            }
            return INSTANCE;
        }
        //线程安全 ,但是效率提高了  (volatile 关键字是 防止重排序,但需要检验两次)
    }
    

    内部类写法

    public class Single {
        
        public static Single getINSTANCE() {
           return Holder.INSTANCE;
        }
        public static class Holder{ 
            private static final Single INSTANCE = new Single();
        }
        // 静态内部类写法, 类加载的时候才加载,而内部类是与外部类同级的,只有用到内部类的时候才加载内部类
        
    }
    

    枚举类写法

    public enum  Single {
       INSTANCE
    }
    // 天生单例 effectiviejava 推荐,
    

    相关文章

      网友评论

          本文标题:总结复写一下java 单例的各种写法6种

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