最初のスレッドが pk で値の更新を完了する前に、2 番目のスレッドが値にアクセスしようとするという putIfAbsent の使用に関する問題が発生しています。
サンプルコード。
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 が呼び出される理由、または pk が生成される前にスレッド 0 がオブジェクトを追加する理由を知っている人はいますか?