gpt4 book ai didi

java - synchronizedMap 线程的这种用法安全吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:26:07 26 4
gpt4 key购买 nike

我有一个单例类,它有一个可以被多个线程同时访问的映射。有人可以检查下面的代码并告诉我它的线程安全吗?(注意:我不打算使用ConcurrentHashMap,而且很少调用printMap方法。)

    public  class MySingleton{

private Map<String,String> cache = Collections.synchronizedMap(
new LinkedHashMap<String,String>());

public String getValue(String key){
return cache.get(key)
}

public void setValue(String key, String value){
cache.put(key, value);
}

public void printMap(){
synchronized(cache){

for(Entry<String,String> entry: cache.entrySet()){
println('key: '+entry.getKey()+', value: ' + value);

}
}

}
}

我的测试正在运行...但我怀疑这段代码是否足以被称为“线程安全”。

我考虑的要点:

  1. readValue 和 putValue 方法不需要“同步” block ,因为我使用的是 synchronizedMap

  2. printMap 应该有同步块(synchronized block),因为 javadoc for 说我们应该在每次迭代之前同步 Map 实例。 http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#synchronizedMap%28java.util.Map%29

感谢任何帮助。

最佳答案

是的,没关系。关键是当你迭代时,没有任何东西可以修改 map ,因为 cache.put 无论如何都会在 cache 上同步。

个人我宁愿通过使用“普通”散列图并从所有三种方法在同一对象(无论是 map 还是其他东西)上同步来明确这一点 - 但你已经得到了应该没问题。

(或者,您可以使用 ConcurrentHashMap 开始。至少值得一看。)

关于java - synchronizedMap 线程的这种用法安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5648983/

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