Java反射,将volatile修饰符添加到私有静态字段

时间:2014-12-19 11:55:06

标签: java reflection synchronization volatile

可以将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.
        }
    }
}

我认为如果我将字段设置为volatile,则循环结束 没有任何问题

1 个答案:

答案 0 :(得分:1)

如果您无法访问该课程,则无法对其进行修改。

相反,找到实例化它的代码,并在其周围添加一个synchronized块:

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

现在,在您的线程代码中,执行:

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

我可以问你为什么需要这个吗?如果一个字段是私有的,通常有一个原因。你通过反思来规避班级创造者的意图...... 此外,在实例构造函数中初始化静态字段似乎...... fishy: - /