这可能是一个相关的问题:Java赋值问题-这是原子性的吗?
我有与OP相同的类,该类对可变字符串引用进行操作。但set很少发生。 (基本上,这个字符串是服务器配置的一部分,只有在强制重新加载时才会重新加载)。
public class Test {
private String s;
public void setS(String str){
s = str;
}
public String getS(){
return s;
}
}
多个线程将同时访问该变量以读取其值。在不声明为volatile的情况下,如何使其“安全”,同时又不必承担性能降级的问题?
我目前的想法是使用ReadWriteLock,但据我所知,ReadWrite锁并不能保证免受线程缓存的影响?除非进行同步处理?这意味着我已经走了一整圈,还不如直接使用
volatile
关键字?我的理解正确吗?没有任何方法可以手动“通知”其他线程有关主内存中变量更新的信息,以便它们可以在一个完整的月球上更新其本地缓存一次吗?
考虑到服务器应用程序旨在长时间运行而无需重新启动,因此在此设置
volatile
似乎过于繁琐。 我认为最好将String设置为static final,并在没有完整应用程序和JVM重新启动的情况下禁止其改变。