2011-03-06 162 views
2

假設以下單:是否產生揮發性類擔保揮發類變量

public class Test{ 
    private static volatile Test test = null; 
    private static int test_int = 0; 
    private static String test_string = "test"; 

    public int getInt(){ 
     return test_int; 
    } 

    public String getString(){ 
     return test_string; 
    } 

    private static Test getInstance(){ 
     if(test == null){ 
      synchronized(Test.class){ 
       if(test == null) 
        test = new Test(); 
      } 
     } 
    } 

通過聲明單個實例測試揮發的test_int和test_string也被認爲是揮發性還是必須聲明爲這樣?我想通過讓課程本身變得不穩定,那麼該課程下的所有東西都會變得不穩定,但是我不確定這一點。提前致謝。

回答

9

不,他們不被認爲是易變的。 只有test變量是不穩定的。在獲得test的價值後(通過getInstance),其波動性與客戶其他行爲無關。

就我個人而言,我會考慮使用AtomicIntegerAtomicReference而不是volatile,說實話。我不知道其他人,但我發現波動的行爲很難可靠地推斷。

請注意,您可能不希望自己的test_inttest_string變量是靜態的......

+0

+1:同意,你應該使用這樣的AtomicInteger,AtomicLong的或的AtomicReference的包裝來處理安全運行。只有狡辯是你只能擁有易變的字段而不是局部變量。 ;) – 2011-03-06 19:49:33

+0

我們如何在上面的例子中使用'AtomicInteger'和'AtomicReference'.Culd編輯並示例 – Deepak 2011-03-07 09:13:19

+0

@Deepak:您只需製作一個最終的AtomicInteger(或其他)變量,然後調用對象以原子方式改變包裝的值。 – 2011-03-07 09:17:38