2014-11-04 104 views
0

公共類A {}Java:這個Singleton類變量賦值線程安全嗎?

// 1。假設測試肯定是一個單身,這裏略過單身默認IMPL

// 2.測試領域的(A類),有沒有髒值的問題,或不它?

// 3. Singleton Object(ex,this sample)字段賦值(在多線程環境中),沒有競爭條件或死鎖問題,還是它?

public class Test 
{ 

    private A a; 

    public A get() { 
     if (a == null) { 
      a = new A(); 
     } 
     return a; 
    } 
} 
+1

有沒有僵局,但它絕對不是thread-安全。你可能很容易結束創建多個實例。 – 2014-11-04 17:48:16

回答

4

您的代碼不是線程安全的。

假設

  1. 線程1名爲Test.get()
  2. 線程1 get()方法檢查(一== NULL) - >這是真的
  3. ---上下文切換這裏 - -
  4. 線程2稱爲test.get()
  5. 線程2 get()方法檢查(一== NULL) - >其是真
  6. 線程2 get()方法創建一個A1對象併爲其分配去
  7. 線程2 get()方法返回A1
  8. ---上下文切換這裏---
  9. 線程1個get()方法創建一個對象A2並將其分配到一個;
  10. 線程1個get()方法返回A2

這意味着兩個不同的線程拿到類的兩個不同實例一

希望這有助於