单例模式常用的三种方式

1.饿汉式(静态常量)

public class Singleton {

    private final static Singleton SINGLETON = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return SINGLETON;
    }
}

总结:该方法比较勤快,每次类被jvm装载时类就被初始化,所以缺点就来了可能导致有时没被用到,造成没必要的浪费。

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

public class Singleton {

    private static Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

总结:这个方法就比较懒了,每次只有调用方法时才会创建对象,但只合适在单线程情况下使用,如果有多个线程的话在执行到if判断时, 会发生多个线程进入判断创建出多个实例,不推荐使用。

3.(线程安全)

public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

总结:该方法是常用的线程安全方法,通过双重判断和synchronized锁保证线程安全,对象只创建一次,下个线程再进来时通过if(singleton == null) 直接返回对象,volatile的意思就是(在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞)具体可以搜索下java内存模型

个人总结:以上三种方法只是个人学习的一些总结,网上单例有很多方式,我个人觉得这三个就够用了,加油,坚持是一种强大的方式。

猜你喜欢

转载自blog.csdn.net/Ocean_999/article/details/84932310