美文网首页
单例模式(Java实现)

单例模式(Java实现)

作者: GCZeng | 来源:发表于2021-11-11 10:49 被阅读0次

    单例模式

    1. 懒汉式(静态常量)

    优点: 使用比较简单,类装载的时候就完成实例化,没有线程同步的问题;
    缺点: 因为在类装载的时候就完成实例化,如果一直没有使用,会浪费内存;
    public class Singleton {
        private final static Singleton INSTANCE = new Singleton();
    
        private Singleton() {
        }
    
        public static Singleton getInstance() {
            return INSTANCE;
        }
    }
    

    2. 饿汉式(静态代码块)

    优缺点和上面的一样,只是实现的方式不同;
    public class Singleton {
        private static Singleton instance;
    
        static {
            instance = new Singleton();
        }
    
        private Singleton() {
        }
    
        public static Singleton getInstance() {
            return instance;
        }
    }
    

    3. 懒汉式(线程不安全)

    只能在单线程下使用,所以这这种写法基本上不使用;
    public class Singleton {
        private static Singleton instance;
    
        private Singleton() {
        }
    
        public static Singleton getInstance() {
            if(instance==null){
                instance = new Singleton();
            }
            return instance;
        }
    }
    

    4. 懒汉式(线程安全,同步方法)

    其实就是加了一个方法锁,效率太差,不推荐使用
    public class Singleton {
        private static Singleton instance;
    
        private Singleton() {
        }
    
        public static synchronized Singleton getInstance() {
            if(instance==null){
                instance = new Singleton();
            }
            return instance;
        }
    }
    

    5. 懒汉式(线程安全,同步代码块)

    这种实现比上面的效率高一点,但是多线程使用会有问题,也不建议使用
    public class Singleton {
        private static Singleton instance;
    
        private Singleton() {
        }
    
        public static Singleton getInstance() {
            if (instance == null) {
                synchronized (Singleton.class) {
                    instance = new Singleton();
                }
            }
            return instance;
        }
    }
    

    6. 双重检查_Double-Check(推荐使用)

    对上面进行了二次非空判断和volatile关键字,这样可以保证了线程安全
    public class Singleton {
        private static volatile Singleton instance;
    
        private Singleton() {
        }
    
        public static Singleton getInstance() {
            if (instance == null) {
                synchronized (Singleton.class) {
                    if (instance == null) {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
    

    7. 静态内部类

    在调用getInstance方法的时候创建实例,避免了内存浪费,并且线程安全
    public class Singleton {
        private Singleton() {
        }
    
        private static class SingletonInstance {
            private static final Singleton INSTANCE = new Singleton();
        }
    
        public static Singleton getInstance() {
            return SingletonInstance.INSTANCE;
        }
    }
    

    8. 枚举

    避免了多线程同步问题,还可以防止反序列化重新创建新的对象
    public enum Singleton {
        INSTANCE;
    
        public void doSomething() {
    
        }
    }
    

    相关文章

      网友评论

          本文标题:单例模式(Java实现)

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