jjzjj

CopyOnWriteArrayList

全部标签

java - 可直接访问的数据结构 Java

我有以下情况:一种只能永远扩展的数据结构(Ionlyever在尾部添加东西)我需要能够跟踪我已经拥有的元素见过(我有一个索引,理想情况下我希望能够开始从这个特定元素再次遍历列表)我希望读取永远不会阻塞,并添加新元素只锁定队列的尾部而不是整个队列这是一个被多个线程大量修改的结构。最好的数据结构是什么?数组列表。如果能够直接访问使用索引看到的最后一个元素,这将是理想的,但它会导致并发修改异常。我可以使其同步,但希望避免锁定(或除最后一个元素之外的任何锁定,因为它是唯一可能存在并发写入以添加新元素的元素)并发链接队列。这将解决我的并发问题,但问题是我必须存储迭代的当前位置而不是整数索引。这有

java - 可直接访问的数据结构 Java

我有以下情况:一种只能永远扩展的数据结构(Ionlyever在尾部添加东西)我需要能够跟踪我已经拥有的元素见过(我有一个索引,理想情况下我希望能够开始从这个特定元素再次遍历列表)我希望读取永远不会阻塞,并添加新元素只锁定队列的尾部而不是整个队列这是一个被多个线程大量修改的结构。最好的数据结构是什么?数组列表。如果能够直接访问使用索引看到的最后一个元素,这将是理想的,但它会导致并发修改异常。我可以使其同步,但希望避免锁定(或除最后一个元素之外的任何锁定,因为它是唯一可能存在并发写入以添加新元素的元素)并发链接队列。这将解决我的并发问题,但问题是我必须存储迭代的当前位置而不是整数索引。这有

java - CopyOnWriteArrayList 适用于什么情况?

这个问题在这里已经有了答案:HowcanCopyOnWriteArrayListbethread-safe?(4个回答)关闭9年前。我正在学习CopyOnWriteArrayList类。复制新数组的目的是什么?是让其他线程读取数组吗?所以如果系统并发高,大部分线程的Action都是读不写,最好使用CopyOnWriteArrayList。 最佳答案 如link中所述:CopyOnWriteArrayList是Java5ConcurrencyAPI中引入的并发Collection类,以及它在Java中流行的表亲ConcurrentHa

java - CopyOnWriteArrayList 适用于什么情况?

这个问题在这里已经有了答案:HowcanCopyOnWriteArrayListbethread-safe?(4个回答)关闭9年前。我正在学习CopyOnWriteArrayList类。复制新数组的目的是什么?是让其他线程读取数组吗?所以如果系统并发高,大部分线程的Action都是读不写,最好使用CopyOnWriteArrayList。 最佳答案 如link中所述:CopyOnWriteArrayList是Java5ConcurrencyAPI中引入的并发Collection类,以及它在Java中流行的表亲ConcurrentHa

java - 为什么 CopyOnWriteArrayList 使用 getArray() 来访问数组引用?

CopyOnWriteArrayList中的几乎所有方法都使用getArray()而不是直接调用数组。这种行为有原因吗?例如:publicintsize(){returngetArray().length;}或publicintindexOf(Objecto){Object[]elements=getArray();returnindexOf(o,elements,0,elements.length);} 最佳答案 “他们为什么要那样设计”问题总是一个猜测问题。这个也是……除非代码的作者(DougLea)向我们解释他的想法。但是,我

java - CopyOnWriteArrayList 或 Vector

全部,Vector类优于ArrayList的地方在于它是同步的,因此可确保线程安全。但是,在CopyOnWriteArrayList和Vector之间,考虑线程安全和性能应该优先考虑什么。 最佳答案 这取决于使用模式-如果读取比写入多得多,请使用CopyOnWriteArrayList,否则使用Vector。Vector为每个操作引入了一个小的同步延迟,当CopyOnWriteArrayList具有较长的写入延迟(由于复制)但没有读取延迟时。另一个考虑因素是迭代器的行为-Vector在迭代它时需要显式同步(因此写操作不能同时执行),

Java:CopyOnWriteArrayList 与 synchronizedList

CopyOnWritearraylist和Collections.synchronizedList(..)有什么区别?什么时候应该优先选择一个。 最佳答案 CopyOnWriteArrayList当读取次数远远超过写入次数时,应使用列表。这是因为您正在用不必要的同步换取每次写入时昂贵的数组复制。例如,当您在多线程环境中有一个事件监听器的List时,您会想要使用CopyOnWriteArrayList,因为事件被触发,因此列表被频繁迭代很少注册事件监听器 关于Java:CopyOnWrit

java - 替代 CopyOnWriteArrayList 用于频繁写入,偶尔迭代

我有一个ArrayList将被缓存并无限期地跨多个线程共享。操作包括频繁的添加和删除,以及偶尔对其进行迭代。ArrayList存在于管理对它的访问的包装类中:publicclassMyListWrapperimplementsIterable{privateListinnerList=newArrayList();publicIteratoriterator(){returninnerList.listIterator();}publicvoidadd(Telement){innerList.add(element);//app-specificlogic}//remove(T),et

java - CopyOnWriteArrayList 如何是线程安全的?

我查看了OpenJDKsourcecode的CopyOnWriteArrayList似乎所有的写操作都受到同一个锁的保护,而读操作根本不protected。据我了解,在JMM下,对变量的所有访问(读取和写入)都应该受到锁的保护,否则可能会发生重新排序的影响。例如,set(int,E)方法包含这些行(处于锁定状态):/*1*/intlen=elements.length;/*2*/Object[]newElements=Arrays.copyOf(elements,len);/*3*/newElements[index]=element;/*4*/setArray(newElements

CopyOnWriteArrayList与CopyOnWriteArraySet详解

什么是CopyOnWrite容器  【1】CopyOnWrite容器是基于并发模式Copy-on-Write模式(最简单的并发解决方案)实现的用于避免共享的数据集合。  【2】CopyOnWrite容器又被成为写时复制的容器,即当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。  【3】适用场景