0
我跑进其中HashSet
是在同一时间访问和修改由多个线程一些阴暗的一段代码,我想知道是什么效果,这可能不得不考虑的Javadoc只在并发,非同步访问下解释行为是“非确定性”的。影响
具体而言,是有可能,以remove(element)
回报true
一个电话,但电话的作用不会被其他线程见过(即contains(element)
总会在其他线程返回true
)?
PS:只是向你保证,我知道这个代码是坏的,我会用等效同步采集更换HashSet
。
谢谢您的回答@Peter!你能为我澄清一些事吗?当你说“一个变化不被另一个线程看到”时,它是否认为这个变化最终会被看到,或者一个(或多个)线程可能会无限期地抛弃一个变化的影响? – ahelix
我通常假设为并发的神恨我们,最坏的事情都可能发生 –
@ahelix有根本没有保障经验法则。结果绝对不会被丢弃,但可见性可能无限期地推迟。更糟的是,各种单独的修改可能在不同的时间可见,导致完全破坏的HashSet对象。 –