根据CopyOnWritearrayList
的javadoc:
ArrayList
的线程安全变体,其中包含所有可变操作 (添加,设置等)是通过制作新的副本来实现的 基础数组
但我想知道为什么每次制作新副本时都会在独占锁中执行此操作。
答案 0 :(得分:4)
即使列表锁定了变异操作,仍然可以获得Iterator
并循环遍历集合,这是不同步的。迭代器不会看到由这些变异操作创建的新副本。这允许其他线程从列表中读取而不必担心由于修改列表而导致的异常,如Javadocs中所述:
"快照" style iterator方法在创建迭代器时使用对数组状态的引用。这个数组在迭代器的生命周期中永远不会改变,因此干扰是不可能的,并且保证迭代器不会抛出ConcurrentModificationException