Java反射,给私有(private)静态字段添加 volatile 修饰符

标签 java reflection synchronization volatile

可以将 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/

相关文章:

mysql - MySQL 上的多源复制

time - 两台远程计算机之间的(时钟)同步

java - swagger-ui 未找到 HTTP 请求的映射

java - 在Java中计算两个HashMap的keySet的并集

c# - 如何在 C# 中调用动态类型的泛型方法

.net - Type.MakeByRefType 的反义词是什么

Java 线程表现不同

java - Hibernate Search 集成到 Play Framework (JPA)

c# - 为什么我需要一个已加载程序集的 AssemblyResolve 处理程序?

python - 使用 python/mod_wsgi 的多个生产者、单个消费者