Java集合 modCount为什么不用volatile修饰?
2个线程 访问一个list 其中一个remove操作了 另一个在迭代 假如不用vol修饰 那么在迭代的那个线程可能感知不到modcount的变化啊
甚至于说官方认为有volatile是一个BUG?https://bugs.java.com/bugdata...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我觉得你是理解有误,首先Java集合中有
modCount
属性未加volatile
的都是线程不安全的集合类,都是单线程集合类single thread collections
,讲单线程集合类放到多线程中去讨论,是很不合适的。所以你的假设,在多线程情况下的可见行问题,根本就不应该出现这个问题!因为你的思路就有问题。
要保证有这个属性的集合类的正确使用至少不会出现在多线程的编程中这是前提条件,为什么呢?
fail-fast
机制是确保集合类遍历过程中集合类不会出现结构性修改(增、删元素)一般认为在遍历时出现结构性修改那么遍历将无法保证所有元素均能被遍历到(新增时)也无法顺利完成遍历(删除时)
要在遍历是进行结构性修改必须配合
Iterator
提供的remove()
方法我觉得你应该考虑的问题是为什么会出现
fail-fast
机制这个东西,这个东西的出现是为了解决什么样子的问题。你要记住
modCount
本身就不是为多线程准备的,再多线程情况下诸如ArrayList
之类的集合类连本身线程安全都保证不了,又有什么必要去设计一个线程安全的modCount
呢?你要一个先天就不具备线程安全的类去实现线程安全的问题干嘛呢,这根本不是它考虑的问题,这完全没有必要。如果真这么做了,就不仅仅是设计过度的问题了。
Description里都写的那么清楚了 还有什么可问的?