gpt4 book ai didi

java - Java 中的字符串和并发

转载 作者:搜寻专家 更新时间:2023-11-01 03:28:00 24 4
gpt4 key购买 nike

这可能是一个相关问题: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;
}
}

多个线程将冲击这个变量来读取它的值。使其“安全”而又不必通过声明其 volatile 而导致性能下降的最佳方法是什么?

我目前正朝着 ReadWriteLock 的方向前进,但据我了解,ReadWrite 锁并不能使其免受线程缓存的影响?除非发生一些同步?这意味着我已经绕了整整一圈回到我还不如使用 volatile 关键字?

我的理解对吗?没有什么可以手动“通知”其他线程有关主内存中变量的更新,以便它们可以在满月时仅更新一次本地缓存吗?

volatile 考虑到服务器应用程序设计为无需重启即可运行数月,这似乎有点过分了。到那时,它的阅读量将达到几百万。我想我还不如将 String 设置为 static final 并且不允许它在没有完整的应用程序和 JVM 重新启动的情况下发生变化。

最佳答案

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

当您使用 volatile 时,它​​需要读取或写入缓存一致副本。这不需要复制到主内存/从主内存进行复制,因为缓存在它们之间进行通信,甚至在套接字之间也是如此。这会影响性能,但这并不意味着不使用缓存。

即使访问一直到主内存,您仍然可以每秒进行数百万次访问。

关于java - Java 中的字符串和并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8267277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com