0

2个线程 访问一个list 其中一个remove操作了 另一个在迭代 假如不用vol修饰 那么在迭代的那个线程可能感知不到modcount的变化啊
甚至于说官方认为有volatile是一个BUG?https://bugs.java.com/bugdata...

zysaaa 10
3 天前提问
2 个回答
4

已采纳

我觉得你是理解有误,首先Java集合中有modCount属性未加volatile的都是线程不安全的集合类,都是单线程集合类single thread collections,讲单线程集合类放到多线程中去讨论,是很不合适的。

所以你的假设,在多线程情况下的可见行问题,根本就不应该出现这个问题!因为你的思路就有问题。

要保证有这个属性的集合类的正确使用至少不会出现在多线程的编程中这是前提条件,为什么呢?
fail-fast机制是确保集合类遍历过程中集合类不会出现结构性修改(增、删元素)
一般认为在遍历时出现结构性修改那么遍历将无法保证所有元素均能被遍历到(新增时)也无法顺利完成遍历(删除时)
要在遍历是进行结构性修改必须配合Iterator提供的remove()方法

我觉得你应该考虑的问题是为什么会出现fail-fast机制这个东西,这个东西的出现是为了解决什么样子的问题。

你要记住modCount本身就不是为多线程准备的,再多线程情况下诸如ArrayList之类的集合类连本身线程安全都保证不了,又有什么必要去设计一个线程安全的modCount呢?

你要一个先天就不具备线程安全的类去实现线程安全的问题干嘛呢,这根本不是它考虑的问题,这完全没有必要。如果真这么做了,就不仅仅是设计过度的问题了。

1
Since the modCount mechanism comes with no guarantees, and users of
single-threaded collections do not expect to pay the (high) price
of a volatile write on every modification operation, the volatile
modifier should be removed.

Description里都写的那么清楚了 还有什么可问的?

撰写答案

推广链接