我在使用 putIfAbsent 时遇到问题,其中第二个线程将在第一个线程完成使用 pk 更新值之前尝试访问该值。
示例代码。
public <T> Object getLookupValue(final Class<T> type, String key, ConcurrentHashMap<String, T> concurrentMap) {
try {
T value = concurrentMap.get(key);
if (value == null) {
System.out.println("save");
T t = type.getDeclaredConstructor(String.class).newInstance(key);
Object returnedValue = concurrentMap.putIfAbsent(key, t);
if (returnedValue == null) {
System.out.println("session save");
session.save(t);
System.out.println("t ouput " + t.toString());
return t;
}
return concurrentMap.get(key);
} else {
System.out.println("update" + concurrentMap.get(name));
return concurrentMap.get(key);
}
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException ex) {
System.out.println("getLookupValue " + ex);
Logger.getLogger(LineReaderParserImpl.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
输出
key 2008 thread 1
save
session save
key 2008 thread 0
update Year{name =2008, pk =null}
year pk null thread 0
save
session save
t ouput Year{name =2008, pk =1}
有谁知道为什么在线程 0 完成添加 pk 之前调用线程 1,或者为什么线程 0 在生成 pk 之前添加对象?