Java中的字符串和并发

这可能是一个相关的问题:
Java assignment issues – Is this atomic?

我有与OP相同的类,它作用于可变字符串引用.但很少发生. (基本上这个字符串是服务器配置的一部分,只有在被强制时才重新加载).

public class Test {
 private String s;

 public void setS(String str){
  s = str;
 }

 public String getS(){
  return s;
 }
}

多个线程将敲击此变量以读取其值.什么是使其“安全”的最佳方法,而不必通过声明其易变性而导致性能下降?

我目前正朝着ReadWriteLock的方向前进,但据我所知,ReadWrite锁不会使线程缓存安全吗?除非发生某些同步?这意味着我已经走了一整圈,我也可以使用volatile关键字?

我的理解是否正确?是否有任何东西可以“通知”其他线程关于主存储器中变量的更新,以便他们可以在满月时只更新一次本地缓存?

鉴于服务器应用程序设计为运行数月而不重新启动,因此volatile似乎有点过分.到那时,它将为几百万次读取提供服务.我想我也可以将String设置为静态final,并且在没有完整的应用程序和JVM重启的情况下不允许它变异.

最佳答案 对引用的读取和写入是原子的.您可能遇到的问题是尝试执行读取和写入(更新)或保证在写入之后所有线程在下次读取时看到此更改.但是,只有您可以说出您的要求.

使用volatile时,需要读取或写入高速缓存一致性副本.这不需要从主存储器进行复制,因为缓存在它们之间进行通信,甚至在套接字之间进行通信.存在性能影响但并不意味着不使用缓存.

即使访问确实一直到主内存,你仍然可以每秒进行数百万次访问.

点赞