懒汉式的线程安全问题

书写步骤:

1.构造方法私有化

2.类的内部提供好一个实例化好的对象

3.返回其对象

 

核心操作:

singleton = new Singleton ();

其语句操作的内容:

1.在堆上分配空间

2.属性初始化

3.引用指向对象(singleton已经不为空)

有可能顺序为1-3-2,所以引入两次检查及volatile关键字,均保证程序的顺序性及线程的安全性

 

懒汉式双重加锁单例模式:

代码如下:

package collection;



class Singleton {
    private String str;

    //禁止指令重排,不管多少线程拿到了singleton对象,一定是完全初始化好的对象
    private static volatile Singleton singleton;

    private Singleton() {
        str = "world";
    }

    public String getStr() {
        return str;
    }

    public static Singleton getInstance() {
        if (singleton == null) {//第一次检查
            synchronized (Singleton.class) {//拿到的对象只有一个
                if (singleton == null) {//第二次检查
                    singleton = new Singleton ();
                }
            }
        }
        return singleton;
    }
}

你可能感兴趣的:(java)