Collections.synchronizedList与CopyOnWriteArrayList比较
1.单线程方式
2.多线程版本,不安全的 ArrayList
3.多线程版本,线程安全,CopyOnWriteArrayList()方式
4.多线程版本,线程安全,Collections.synchronizedList方式
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* @author zsh
* @site qqzsh.top
* @create 2019-08-26 11:53
* @description Collections.synchronizedList与CopyOnWriteArrayList比较
* https://liuyanzhao.com/9732.html
*/
public class Main3 { /**
* 单线程:性能较差
*/
static void f1(){
Long startTime = System.currentTimeMillis();
//这是一个长度为1000的集合
List<Long> sourceList = new ArrayList<>();
for (long i = 0L; i < 1000L; i++) {
sourceList.add(i);
}
System.out.println("原列表大小:" + sourceList.size());
//对原列表进行处理
List<Long> resultList = new ArrayList<>();
for (Long x : sourceList) {
//模拟耗时操作(x累加300万次)
Long sum = 0L;
for (long i = 0L; i < 3000000L; i++) {
sum += x;
}
resultList.add(sum);
}
System.out.println("处理后的列表大小:" + resultList.size());
System.out.println("耗时:" + (System.currentTimeMillis() - startTime) + "ms");
} /**
* 多线程版本,不安全的 ArrayList
*/
static void f2(){
Long startTime = System.currentTimeMillis();
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
//这是一个长度为1000的集合
List<Long> sourceList = new ArrayList<>();
for (long i = 0L; i < 1000L; i++) {
sourceList.add(i);
}
System.out.println("原列表大小:" + sourceList.size());
List<Long> resultList = new ArrayList<>();
for (Long x : sourceList) {
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
//对原列表进行处理
//模拟耗时操作(x累加300万次)
Long sum = 0L;
for (long i = 0L; i < 3000000L; i++) {
sum += x;
}
resultList.add(sum);
}
});
}
fixedThreadPool.shutdown();//关闭线程池
//此处不可以删除或注释,需要线程执行结束后再执行别的内容,即只有线程结束后才会继续向下执行
while (!fixedThreadPool.isTerminated()) {
}
System.out.println("处理后的列表大小:" + resultList.size());
System.out.println("耗时:" + (System.currentTimeMillis() - startTime) + "ms");
} /**
* 多线程版本,线程安全,CopyOnWriteArrayList()方式
*/
static void f3(){
Long startTime = System.currentTimeMillis();
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
//这是一个长度为1000的集合
List<Long> sourceList = new ArrayList<>();
for (long i = 0L; i < 1000L; i++) {
sourceList.add(i);
}
System.out.println("原列表大小:" + sourceList.size());
List<Long> resultList = new CopyOnWriteArrayList<>();
for (Long x : sourceList) {
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
//对原列表进行处理
//模拟耗时操作(x累加300万次)
Long sum = 0L;
for (long i = 0L; i < 3000000L; i++) {
sum += x;
}
resultList.add(sum);
}
});
}
fixedThreadPool.shutdown();//关闭线程池
//此处不可以删除或注释,需要线程执行结束后再执行别的内容,即只有线程结束后才会继续向下执行
while (!fixedThreadPool.isTerminated()) {
}
System.out.println("处理后的列表大小:" + resultList.size());
System.out.println("耗时:" + (System.currentTimeMillis() - startTime) + "ms");
} /**
* 多线程版本,线程安全,Collections.synchronizedList方式
*/
static void f4(){
Long startTime = System.currentTimeMillis();
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
//这是一个长度为1000的集合
List<Long> sourceList = new ArrayList<>();
for (long i = 0L; i < 1000L; i++) {
sourceList.add(i);
}
System.out.println("原列表大小:" + sourceList.size());
List<Long> resultList = Collections.synchronizedList(new ArrayList<>());
for (Long x : sourceList) {
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
//对原列表进行处理
//模拟耗时操作(x累加300万次)
Long sum = 0L;
for (long i = 0L; i < 3000000L; i++) {
sum += x;
}
resultList.add(sum);
}
});
}
fixedThreadPool.shutdown();//关闭线程池
//此处不可以删除或注释,需要线程执行结束后再执行别的内容,即只有线程结束后才会继续向下执行
while (!fixedThreadPool.isTerminated()) {
}
System.out.println("处理后的列表大小:" + resultList.size());
System.out.println("耗时:" + (System.currentTimeMillis() - startTime) + "ms");
} public static void main(String[] args) {
/*f1();*/
/*f2();*/
/*f3();*/
f4();
}
}
Collections.synchronizedList与CopyOnWriteArrayList比较的更多相关文章
- Collections.synchronizedList 、CopyOnWriteArrayList、Vector介绍、源码浅析与性能对比
## ArrayList线程安全问题 众所周知,`ArrayList`不是线程安全的,在并发场景使用`ArrayList`可能会导致add内容为null,迭代时并发修改list内容抛`Concurre ...
- CopyOnWriteArrayList与Collections.synchronizedList的性能对比
列表实现有ArrayList.Vector.CopyOnWriteArrayList.Collections.synchronizedList(list)四种方式. 1 ArrayList Array ...
- CopyOnWriteArrayList与Collections.synchronizedList的性能对比(转)
列表实现有ArrayList.Vector.CopyOnWriteArrayList.Collections.synchronizedList(list)四种方式. 1 ArrayList Array ...
- CopyOnWriteArrayList&Collections.synchronizedList()
1.ArrayList ArrayList是非线性安全,此类的 iterator() 和 listIterator() 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remov ...
- ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 以及 同步的集合类 Hashtable 和 Vector Collections.synchronizedMap 和 Collections.synchronizedList 区别缺点
ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含 ...
- Collections.synchronizedList线程安全性陷阱
摘要: 详细的解析:Collections.synchronizedList 1 :关注要点,为什么在有synchroniezed方法的同时会出现 Collections.synchronizedLi ...
- 【集合类型的并发】Collections.synchronizedList
摘要: 详细的解析:Collections.synchronizedList :关注要点,为什么在有synchroniezed方法的同时会出现 Collections.synchronizedList ...
- Collections.synchronizedList使用
1.SynchronizedList类具体代码: static class SynchronizedList<E> extends SynchronizedCollection<E& ...
- 线程安全Collections.synchronizedList
ollections.synchronizedList引发的线程安全问题 有些容器是线程安全的(Vector,ConcurrentLinkedQueue等),有些则不是(list等),利用类 似 pr ...
随机推荐
- redis学习(二)——案例练习
案例需求: 1.提供index.html页面,页面中有一个省份下拉列表 2.当页面加载完成后发送ajax请求,加载所有省份 3.列表中的省份保持不变,则之后每次刷新页面都是从redis中获取 * 注意 ...
- Word 插入页码 -- 视频教程(7)
1. 以本科做的一个课程设计为例 >> 视频教程链接:B站,速度快,清晰 未完 ...... 点击访问原文(进入后根据右侧标签,快速定位到本文)
- 怎样遍历NodeList对象
因为NodeList对象是一个类似数组的对象, 且它自带了一个 forEach() 方法, 因此可以使用 forEach() 遍历, 它的用法和 Array 里面的 forEach() 是完全一样的. ...
- oracle 分页sql
select * from ( SELECT A.*, ROWNUM RN FROM ( SELECT A.*,B.USERPWiD from 测试表2 A left join 测试表3 B on A ...
- Net Core 自定义 Middleware 加密解密
前言:第一次写文章,有问题请轻喷 当前使用 Net Core 版本 2.1.3 我们经常在开发中需要把实体的主键 Id 传输到前端,但是在Get的时候又不想让前端能看到明文,我们通常会加密这些数据,所 ...
- 学习笔记—log4net
一.log4net.dll下载地址:http://logging.apache.org/log4net/download_log4net.cgi 二.在项目中引用log4net.dll 三.设置在程序 ...
- nginx.conf配置demo
#user nobody; worker_processes 4; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...
- python小作业
目录 1.简述变量命名规范 2.name = input(">>>") name变量是什么数据类型通过代码检测 3.if条件语句的基本结构? 4.用print打印 ...
- Spring Security Architecture and Implementation(架构和实现)学习笔记
Spring Security 关于spring-security的官网文档学习笔记,主要是第8章 Architecture and Implementation(架构和实现)内容 参考: https ...
- Others-SAP hybris 介绍
https://wenku.baidu.com/view/6bf4d3a73169a4517623a33d.html