2014-12-19 72 views
0

可以將volatile修飾符添加到私有和靜態的字段中?Java反射,將volatile修飾符添加到私有靜態字段

示例代碼

// I don't know when test is initalized 
public class Test { 
    private static String secretString; 

    public Test() { 
     secretString = "random"; 
    } 
} 

public class ReflectionTest extends Thread { 
    public void run() { 
     Class<?> testClass = Class.forName("Test"); 
     Field testField = testClass.getDeclaredField("secretString"); 

     while (testField.get(null) == null) { 
      // Sleep, i don't know when test is initalized 
      // When it'is i need the String value 
      // But this loop never end. 
     } 
    } 
} 

我想,如果我設置字段揮發性循環結束 沒有任何問題

+0

添加最後的關鍵字爲什麼你想揮發? – SMA 2014-12-19 11:58:18

+1

你的意思是,寫'private static volatile string secretString'?是的,那是可能的。如果你不是這個意思,那麼你的問題就會讓人產生誤解和不準確。 – 2014-12-19 12:00:29

+1

而不是問是否可能,以及它是否會有所幫助,爲什麼不嘗試做,看看會發生什麼? – Dima 2014-12-19 12:04:02

回答

1

如果您沒有訪問類,你不能修改它。

相反,找到實例化它的代碼,並添加它周圍的同步塊:

synchronized(Test.class) { 
    new Test(); 
} 

現在,在你的線程代碼,這樣做:

while(true) { 
    synchronized(Test.class) { 
     if(testField.get(null) == null) break; 
    } 
    // ... whatever 
} 

請問爲什麼你需要這個?如果一個字段是私人的,通常是有原因的。你正在繞過類創建者的意圖與您的反射... 此外,初始化實例構造函數中的靜態字段似乎...魚腥: -/

+0

這並不能解決我的問題,該字段始終爲空 – Emax 2014-12-19 14:38:20

+0

如果該字段始終爲空,那麼您的循環將永遠不會退出:)這無關緊要與線程或波動性。您需要一些代碼來修改該字段的值。 – Dima 2014-12-19 14:55:48

+0

我需要在測試類初始化時讀取字段的值 – Emax 2014-12-19 15:12:27

相關問題