List 常见类以及各自优缺点可自行参考 https://blog.csdn.net/weixin_39883065/article/details/111197724
本机环境
java 版本:1.8.0_161
window 信息:
测试代码
下面通过代码测试 List 线程安全类 Vector、Collections.synchronizedList(List list)、CopyOnWriteArrayList
测试添加 1 亿数据,开启 100 个线程,每个线程插入 100万
public class TestList {
public static void main(String[] args) throws InterruptedException {
long startTime = System.currentTimeMillis();
// 线程不安全
// List<Integer> list = new ArrayList<>();
// 线程安全 100000000 耗时 27357
// List<Integer> list = new Vector<>();
// 线程安全 100000000 耗时 22023
List<Integer> list = Collections.synchronizedList(new ArrayList<>());
// 线程安全 100000000 耗时
//List<Integer> list =new CopyOnWriteArrayList<>();
int threadNum = 100;
CountDownLatch countDownLatch = new CountDownLatch(threadNum);
for (int i = 0; i < threadNum; i++) {
Thread thread = new Thread(() -> {
for (int j = 0; j < 1000000; j++) {
list.add(j);
}
countDownLatch.countDown();
});
thread.start();
}
countDownLatch.await();
long endTime = System.currentTimeMillis();
System.out.println(list.size());
System.out.println(list.getClass()+"耗时: "+(endTime-startTime));
}
}
ArrayList 结果
Collections.synchronizedList(List list) 结果
Vector 结果
CopyOnWriteArrayList 结果,暂无结果,运行超 20 分钟,放弃测试
总结
- 读多写少的情况下,推荐使用 CopyOnWriteArrayList 方式
- 读少写多的情况下,推荐使用 Collections.synchronizedList() 和 Vector 差距不大