Я получаю исключение из метода putIfAbsent из Guava BiMap в многопоточной ситуации.Как я должен правильно защитить его от проблем с многопоточностью?
Я создаю карту следующим образом:
BiMap<Integer, java.net.URI> cache = com.google.common.collect.Maps.synchronizedBiMap(HashBiMap.create());
Тогда единственный раз, когда я изменяю карту, этоcache.clear();
или cache.putIfAbsent(a,b)
Я иногда видел эту трассировку стека:
java.lang.IllegalArgumentException: value already present: http://example.com
at com.google.common.collect.HashBiMap.put(HashBiMap.java:279)
at com.google.common.collect.HashBiMap.put(HashBiMap.java:260)
at java.util.Map.putIfAbsent(Map.java:744)
at com.google.common.collect.Synchronized$SynchronizedMap.putIfAbsent(Synchronized.java:1120)
Это ошибка в HashBiMap или synchronizedBiMap?Или мне нужно проделать дополнительную работу для обеспечения безопасности потоков?
Использование guava-25.0-jre
и Java(TM) SE Runtime Environment 1.8.0_152-b16