可以将 volatile 修饰符添加到私有(private)静态字段吗?
示例代码
// 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 ,则循环结束 没有任何问题
最佳答案
如果您无权访问该类,则无法修改它。
相反,找到实例化它的代码,并在其周围添加一个同步块(synchronized block):
synchronized(Test.class) {
new Test();
}
现在,在您的线程代码中,执行以下操作:
while(true) {
synchronized(Test.class) {
if(testField.get(null) == null) break;
}
// ... whatever
}
请问为什么需要这个?如果某个字段设为私有(private),通常是有原因的。您正在通过使用反射来规避类创建者的意图...... 另外,在实例构造函数中初始化静态字段似乎......可疑:-/
关于Java反射,给私有(private)静态字段添加 volatile 修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27565619/