影响

2013-02-04 59 views
0

我跑进其中HashSet是在同一时间访问和修改由多个线程一些阴暗的一段代码,我想知道是什么效果,这可能不得不考虑的Javadoc只在并发,非同步访问下解释行为是“非确定性”的。影响

具体而言,是有可能,以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对象。 –