Я не могу синхронизировать два потока, используя набор:
private Set<String> set;
...
set = Collections.synchronizedSet(new HashSet<String>());
и передача его в два потока. Один доступ:
synchronized (set) {
// [1]
if (set.contains(str)) {
...
} else {
// [3]
}
}
и другое обновление:
synchronized (set) {
set.add(str); // [2]
...
}
Что происходит, так это то, что [1], [2], [3] происходит последовательно. Во время [1] правильно, что в наборе еще нет предмета, который я ищу. Но затем [2] обновляет его, добавляя элемент. А во время [3] я сейчас вижу предмет. Как это исправить? У меня также есть ConcurrentHashMap, совместно используемый теми же потоками, но он прекрасно работает. Что такое набор, эквивалентный ConcurrentHashMAp?
ОБНОВЛЕНИЕ: код слишком длинный. В любом случае, мой обновленный вопрос - что такое набор, эквивалентный ConcurrentHAshMap?