在Java中,同时更改对HashMap读取的引用是否安全
我希望这不是一个太愚蠢的问题...
我的项目中有类似于以下内容的代码:
public class ConfigStore {
public static class Config {
public final String setting1;
public final String setting2;
public final String setting3;
public Config(String setting1, String setting2, String setting3) {
this.setting1 = setting1;
this.setting2 = setting2;
this.setting3 = setting3;
}
}
private volatile HashMap<String, Config> store = new HashMap<String, Config>();
public void swapConfigs(HashMap<String, Config> newConfigs) {
this.store = newConfigs;
}
public Config getConfig(String name) {
return this.store.get(name);
}
}
在处理请求时,每个线程将使用 getConfig() 函数从存储区请求一个配置。但是,定期(最有可能每隔几天)使用 swapConfigs() 函数更新并换出配置。调用 swapConfigs() 的代码不会保留对它传入的 Map 的引用,因为它只是解析配置文件的结果。
- 在这种情况下,存储实例变量上是否仍需要关键字?
volatile
- 关键字是否会引入任何我应该注意或可以避免的潜在性能瓶颈,因为读取速率大大超过写入速率?
volatile
非常感谢,