2013-02-04 3 views
0

Я столкнулся с некоторой теневой частью кода, в которой HashSet был доступен и изменен несколькими потоками одновременно, и я хотел знать, какие последствия это могло бы иметь, учитывая только Javadoc объясняет, что поведение является «недетерминированным» при одновременном, несинхронизированном доступе.Эффекты одновременного доступа на HashSet

В частности, возможно, что вызов remove(element) возвращается true, но что последствия вызова никогда не когда-либо видел другими потоками (то есть. contains(element) всегда будет возвращать true в других потоках)?

PS: Просто чтобы вас успокоить, я знаю, что этот код плох, и я заменил HashSet эквивалентной синхронизированной коллекцией.

ответ

2

Доступ к HashSet в нескольких потоках может.

  • результат в результате изменения, которое вы не видите в другом потоке.
  • Итератор для отказа при возникновении ConcurrentModifcationException.
  • нить, чтобы войти в бесконечный цикл внутри HashSet кода (редкий, но очень плохо, когда он делает)

Примечание: простая замена использовать

Set<Type> set = Collections.newSetFromMap(new ConcurrentHashMap<Type, Boolean>()); 
+0

Спасибо за ваш ответ @Peter! Не могли бы вы прояснить что-то для меня? Когда вы говорите, что «изменение не видно другим потоком», предполагается ли это изменение в конечном счете, или возможно, что эффект изменения отбрасывается неограниченно на один (или более) поток? – ahelix

+2

Обычно я полагаю, как правило, что боги параллелизма ненавидят нас, и могут произойти худшие возможные вещи. –

+0

@ahelix. Просто нет гарантии. Результаты, безусловно, не будут отброшены, но видимость может быть отложена на неопределенный срок. Хуже всего то, что различные индивидуальные модификации могут становиться видимыми в разное время, что приводит к полностью сломанному объекту «HashSet». –

Смежные вопросы