java 单例模式

作者: torres9gogogo | 来源:发表于2018-08-09 21:16 被阅读9次

    1、定义:
    所谓单例类就是指该类只能有一个实例对象,无论如何获取拿到的都是同一个对象。
    2、用处:
    整个系统中只允许new 一个对象。spring 容器默认单实例。
    3、实现:
    (1)定义一个静态全局对象引用。
    (2)该类构造函数保护,private。
    (3)提供静态方法获取该实例。
    (4)由于需要一个全局对象引用,考虑多线程获取的安全问题。
    (5)性能,懒加载or初始化加载。

    package designpattern;
    
    public class SingletonPattern {
    
        public static void main(String[] args) throws Exception {
            Singleton1 singleton1 = Singleton1.getInstance();
            Singleton1 singleton2 = Singleton1.getInstance();
            System.out.println(singleton1 == singleton2);
        }
    
    }
    
    //非线程安全,获取时加载 。
    //thread1 、2 同时 进入 if (singleton1 == null) {
    //可能获取不同的实例对象
    class Singleton1 {
    
        private static Singleton1 singleton1 = null;
    
        private Singleton1() {
        }
    
        public static Singleton1 getInstance() {
            if (singleton1 == null) {
                singleton1 = new Singleton1();
            }
            return singleton1;
        }
    }
    
    //线程安全,饿汉式 ,加载字节码文件初始化一个该实例
    //jvm加载字节码进行类的初始化的时候是不允许其他线程进入的,静态成员变在
    //类第一次加载的时候初始化,这里利用jvm保
    //证、线程的安全
    class Singleton2 {
    
        private static final Singleton2 INSTANCE = new Singleton2();
    
        private Singleton2() {
        }
    
        public static Singleton2 getInstance() {
            return INSTANCE;
        }
    }
    //线程安全,同步整个方法,每次获取都要去占锁,不优雅,效率较低
    class Singleton3 {
    
        private static Singleton3 singleton3 = null;
    
        private Singleton3() {
        }
    
        public static synchronized Singleton3 getInstance() {
            if (singleton3 == null) {
                singleton3 = new Singleton3();
            }
            return singleton3;
        }
    }
    //静态内部类实现,线程安全,比饿汉试好。推荐
    class Singleton4 {
    
        private static class SingletonHolder {
    
            private static final Singleton4 INSTANCE = new Singleton4();
        }
    
        private Singleton4() {
        }
    
        public static Singleton4 getInstance() {
            return SingletonHolder.INSTANCE;
        }
    
    }
    //二次判null 线程安全,优雅效率高。推荐
    class Singleton5 {
    
        private static volatile Singleton5 singleton5 = null;
    
        private Singleton5() {
        }
    
        public static Singleton5 getInstance() {
            if (singleton5 == null) {
                synchronized (Singleton5.class) {
                    if (singleton5 == null) {
                        return new Singleton5();
                    }
                }
            }
            return singleton5;
        }
    }
    //枚举实现,不太懂,不推荐。
    enum Singleton6 {
        INSTANCE;
    
        //任意方法,调用时使用INSTANCE.方法名
        public void whateverMethod() {
        }
    

    相关文章

      网友评论

        本文标题:java 单例模式

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