【发布时间】:2018-08-09 04:04:00
【问题描述】:
我有一个关于同步的问题。我有一个实例:
`
@Service
public class MyService {
//if singleton - should this map be static?
private static Map<String, String> cache = new ConcurrentHashMap<String, String>();
public String put(String value) {
if (!cache.containsKey(value)) {
String newValue = someRandomString();
cache.put(value, newValue);
return newValue;
}
return cache.get(value);
}
public String get(String value) {
return cache.entrySet().stream()
.filter(e -> e.getValue().equals(value))
.map(Map.Entry::getKey)
.findFirst().get();
}
}
问题是 - 在单例和许多线程调用服务的情况下如何进行正确的同步。似乎这两种方法都受到影响,有时无法为相同的字符串值计算/放入映射中的适当数据。 ConcurrentHashMap 会被 SynchronizedMap 取代吗?我应该在这两种方法中创建一个同步块吗?
【问题讨论】:
-
value是第一种方法中的键和第二种方法中的值,这很容易引起误解。 -
这确实是一个糟糕的重复,但对于 OP 问题来说真的很糟糕。
-
@davidxxx 我同意。重新打开。
标签: java concurrency