1. 程式人生 > >Java賦值的執行緒安全問題

Java賦值的執行緒安全問題

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,不存線上程安全問題