美文网首页程序员
比较实用的单例模式

比较实用的单例模式

作者: 尉昌达 | 来源:发表于2020-06-16 23:05 被阅读0次

    1.饿汉式

    /**
     * 饿汉式
     * 类加载到内存后,就实例化一个单例,JVM保证线程安全
     * 简单实用,推荐使用!
     * 唯一缺点:不管用到与否,类装载时就完成实例化
     * Class.forName("")
     * (话说你不用的,你装载它干啥)
     */
    public class Mgr01 {
        private static final Mgr01 INSTANCE = new Mgr01();
    
        private Mgr01() {};
    
        public static Mgr01 getInstance() {
            return INSTANCE;
        }
    
        public void m() {
            System.out.println("m");
        }
    
        public static void main(String[] args) {
            Mgr01 m1 = Mgr01.getInstance();
            Mgr01 m2 = Mgr01.getInstance();
            System.out.println(m1 == m2);
        }
    }
    

    2.静态内部类方式

    /**
     * 静态内部类方式
     * JVM保证单例
     * 加载外部类时不会加载内部类,这样可以实现懒加载
     */
    public class Mgr07 {
    
        private Mgr07() {
        }
    
        private static class Mgr07Holder {
            private final static Mgr07 INSTANCE = new Mgr07();
        }
    
        public static Mgr07 getInstance() {
            return Mgr07Holder.INSTANCE;
        }
     
    }
    

    3.枚举类单例

    //枚举的单例模式不仅可以解决线程同步,还可以防止反序列化。
    public class User {
        //私有化构造函数
        private User(){ }
    
        //定义一个静态枚举类
        static enum SingletonEnum{
            //创建一个枚举对象,该对象天生为单例
            INSTANCE;
            private User user;
            //私有化枚举的构造函数
            SingletonEnum(){
                user=new User();
    //            System.out.println("调用私有化枚举的构造函数");
            }
            public User getInstnce(){
                return user;
            }
        }
    
        //对外暴露一个获取User对象的静态方法
        public static User getInstance(){
            return SingletonEnum.INSTANCE.getInstnce();
        }
       
    
    }
    
    

    相关文章

      网友评论

        本文标题:比较实用的单例模式

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