Java中CopyOnWriteArrayList的作用 分析读写分离的线程安全List

说白了,CopyOnWriteArrayList是一个线程安全的列表,用硬写操作换取快速读操作。
我们先来说说最重要的事情。
它基于在每次写入操作之前复制整个列表,然后编辑新列表并替换旧列表。
读操作直接引用当前链表,没有锁。
去年我们跑后台配置项目时,读操作峰值达到了3 000次/秒,并且没有任何滞后。
还有一点就是书面作品的成本也不低。
有一个实验使用 1 00,000 个元素的列表。
每添加一个元素,CPU就会自动将CPU提升到9 0%以上,内存也会立即增加一倍。
还有一个重要的细节,终于一致了。
如果更改数据,读数可能仍然过时。
强烈建议不要将其用于监控系统中的警报。

一开始我以为写什么都很快,后来发现写一个大单可能要花半天时间。
等等,还有别的事。
内存管理功能非常强大。
如果您频繁写入,JVM 将需要更频繁地进行垃圾回收。

建议不要将其作为万能药来使用。
如果读取率超过8 0%,数据量不超过1 00万条,实时性要求不高,则使用比较合适。

Java中的Vector类和ArrayList类有什么区别,为什么Vector类不常用了?

哈,你的问题让我想起了我以前用Java编程的时候。
我记得曾经开发过一个多线程缓存系统,当时我使用的是 Vector。
当时,我认为线程很安全,而且用起来很舒服。

但是后来发现Vector是线程安全的,但是性能确实很差。
记得有一次测试高频写入场景,Vector的吞吐量远低于ArrayList。
另外,Vector的扩展策略是每次都翻倍,在ArrayList中是5 0%。
我觉得我不必太担心使用ArrayList。

我们来谈谈API设计。
Vector 的 elementAt() 和 setElementAt() 等方法感觉有点老旧,并且与当前的 Java 集合框架不同。
ArrayList 的方法简单直接,就像更现代的 get() 和 set() 一样。

后来,随着Java的发展,尤其是单字符串或者高性能的情况下,基本都使用ArrayList。
对于多线程,使用Collections.synchronizedList()来同步ArrayList;或者直接使用并发集合,例如ConcurrentLinkedQueue。
|所以现在我会根据具体需求选择合适的集合类。

但是,您可以根据自己的具体需求选择合适的集合类。
性能绳安全; API设计;这些都是您需要考虑的因素。

如何在Java中使用Collections.synchronizedList

请稍等。
昨天我在屏幕上输入代码时工作到很晚,突然意识到 Collections.synchronizedList 方法特别有用。
我正在创建一个后台任务,需要多个线程同时将数据添加到列表中,但列表本身是一个 ArrayList 并且不是线程安全的。
我尝试使用 Collections.synchronizedList 将所有内容放在一起,结果非常棒。
不过,我还记得迭代时必须手动锁定它。
否则会出现并发修改异常。
今天早上回想起来,我突然想到,如果场景中读操作多于写操作,那么使用CopyOnWriteArrayList可能会更好。
这个问题需要重新考虑。