CopyOnWriteArrayList

来源:互联网 发布:苹果手机淘宝p图软件 编辑:程序博客网 时间:2024/06/07 01:58

CopyOnWriteArrayList容器的线程安全性在于:只要正确地发布一个事实不可变的对象,那么在访问该对象的时候就不再需要进一步的同步。在每次修改的时候,都会创建并重新发布一个新的容器副本,从而实现可变性。

实现线程安全的关键在于事实不可变,对象既然不可变,所以就是线程安全的,当需要的时候,就重新生成一个全新的容器,从而实现可变性。

实现方式:

(1)“写入时复制”容器的迭代器保留一个指向底层基础数组的引用,这个数组当前位于迭代器的起始位置,由于它不会被修改,因此在对其进行同步时只需确保数组内容的可见性。因此,多个线程可以同时对这个容器进行迭代,而不会彼此干扰或者修改容器的线程相互干扰。“写入时复制”不会抛出ConcurrentModificationException,并且返回的元素与迭代器创建时的元素完全一致,而不必考虑修改操作所带来的影响。

(2)显然,每次修改容器都会复制底层数组,着需要一定的开销,特别是当容器规模较大的时候。仅当迭代操作远远多于修改操作时,才应该使用“写入时复制”容器,这个准则很好地描述了许多事件通知系统:在分发通知时需要迭代已注册监听器链表,并调用每一个监听器,在大多数情况下,注册和注销事件监听器的操作远少于接收事件通知的操作。

应用场景:

可以用在EventBus中,用来作为订阅信息的存储,这里迭代操作远多于修改操作。

0 0
原创粉丝点击