您的位置:首页 > 编程语言 > Java开发

Java赋值的线程安全问题

2015-08-13 16:22 483 查看
A  a = new A();

这个操作分为三部处理

1.栈里创建a的符号引用

2.堆里创建A对象

3.把a指向A

所以,这个赋值语句不是线程安全的,比如下面的代码

public class A {

    private volatile static A a;

    

    public static A getInstance() {

        if(a == null) {

            synchronized(A.class) {

                if(a == null) { // ①

                    a = new A();

                }

            }

        }

        return a;

    }

}

在判断①的时候,别的线程进行了1的操作(栈里创建a的符号引用),这时a是null,并且a还没有指向A。

那么,另一个线程就会进入if语句块,也创建a,并且new A(),这样就会有2个A对象在堆里

int i = 1;

是线程安全的,因为这条语句会被翻译为一条指令iconst_1,不存在线程安全问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java