CopyOnWriteArraySet

阅读JDK8 CopyOnWriteArraySet应该了解什么

风流意气都作罢 提交于 2020-04-09 20:25:16
1、为什么说该集合是线程安全 final transient ReentrantLock lock = new ReentrantLock(); private transient volatile Object[] array; public boolean add(E e) { final ReentrantLock lock = this.lock; lock.lock(); try { Object[] elements = getArray(); int len = elements.length; Object[] newElements = Arrays.copyOf(elements, len + 1); newElements[len] = e; setArray(newElements); return true; } finally { lock.unlock(); } } 该集合中add,set通过ReentrantLock实现同步,volatile定义的变量在线程间可见的。 2、为什么不适用synchronized synchronized和ReentrantLock的作用是相同的,但ReentrantLock提供更丰富的特性,比如:定时锁等待,可中断锁,锁投票等,性能更优一些。ReentrantLock提供了可轮询的锁请求,他可以尝试的去取得锁

CopyOnWriteArrayList详解

纵饮孤独 提交于 2019-12-06 09:28:42
CopyOnWriteArrayList是 ArrayList 的一个线程安全的变体,其中所有可变操作(add、set等等)都是通过对底层数组进行一次新的复制来实现的。 这一般需要很大的开销,但是当遍历操作的数量大大超过可变操作的数量时,这种方法可能比其他替代方法 更 有效。在不能或不想进行同步遍历,但又需要从并发线程中排除冲突时,它也很有用。“快照”风格的迭代器方法在创建迭代器时使用了对数组状态的引用。此数组在迭代器的生存期内不会更改,因此不可能发生冲突,并且迭代器保证不会抛出ConcurrentModificationException。创建迭代器以后,迭代器就不会反映列表的添加、移除或者更改。在迭代器上进行的元素更改操作(remove、set和add)不受支持。这些方法将抛出UnsupportedOperationException。 允许使用所有元素,包括null。 内存一致性效果:当存在其他并发 collection 时,将对象放入CopyOnWriteArrayList之前的线程中的操作 happen-before 随后通过另一线程从CopyOnWriteArrayList中访问或移除该元素的操作。 这种情况一般在多线程操作时,一个线程对list进行修改。一个线程对list进行fore时会出现java.util