Я столкнулся с некоторой теневой частью кода, в которой HashSet
был доступен и изменен несколькими потоками одновременно, и я хотел знать, какие последствия это могло бы иметь, учитывая только Javadoc объясняет, что поведение является «недетерминированным» при одновременном, несинхронизированном доступе.Эффекты одновременного доступа на HashSet
В частности, возможно, что вызов remove(element)
возвращается true
, но что последствия вызова никогда не когда-либо видел другими потоками (то есть. contains(element)
всегда будет возвращать true
в других потоках)?
PS: Просто чтобы вас успокоить, я знаю, что этот код плох, и я заменил HashSet
эквивалентной синхронизированной коллекцией.
Спасибо за ваш ответ @Peter! Не могли бы вы прояснить что-то для меня? Когда вы говорите, что «изменение не видно другим потоком», предполагается ли это изменение в конечном счете, или возможно, что эффект изменения отбрасывается неограниченно на один (или более) поток? – ahelix
Обычно я полагаю, как правило, что боги параллелизма ненавидят нас, и могут произойти худшие возможные вещи. –
@ahelix. Просто нет гарантии. Результаты, безусловно, не будут отброшены, но видимость может быть отложена на неопределенный срок. Хуже всего то, что различные индивидуальные модификации могут становиться видимыми в разное время, что приводит к полностью сломанному объекту «HashSet». –