【Java多线程】并发容器CopyOnWriteArrayList
一个不安全的List
预期输出结果为10000,但是实际运行结果为9992,是因为线程不安全,应该使用synchronized同步块
不安全代码
package cn.hanquan.test;import java.util.ArrayList;
import java.util.List;/** 线程不安全的例子*/
public class TestList {public static void main(String[] args) throws InterruptedException {List<String> list = new ArrayList<String>();for (int i = 0; i < 10000; i++) {new Thread(() -> {list.add(Thread.currentThread().getName());}).start();}Thread.sleep(10000);System.out.println(list.size());}
}
安全代码:(1)
输出结果为:10000
package cn.hanquan.test;import java.util.ArrayList;
import java.util.List;/** 线程安全的例子*/
public class TestList {public static void main(String[] args) throws InterruptedException {List<String> list = new ArrayList<String>();for (int i = 0; i < 10000; i++) {new Thread(() -> {synchronized (list) {list.add(Thread.currentThread().getName());}}).start();}Thread.sleep(10000);System.out.println(list.size());}
}
安全代码:(2)
- 使用安全的
CopyOnWriteArrayList
替代普通的List
CopyOnWriteArrayList能够保证工作内存和主内存在写的过程中能够正确的控制。因为其内部已经实现了synchronized。
package cn.hanquan.test;import java.util.concurrent.CopyOnWriteArrayList;/** 线程不安全的例子*/
public class TestList {public static void main(String[] args) throws InterruptedException {CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();for (int i = 0; i < 10000; i++) {new Thread(() -> {list.add(Thread.currentThread().getName());}).start();}Thread.sleep(10000);System.out.println(list.size());}
}
输出结果为:10000
【Java多线程】并发容器CopyOnWriteArrayList相关推荐
- java 计时器_Java多线程并发容器之并发倒计时器
从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; 执行后,size-这种方式来实现.但是在多线程并发的情 ...
- Java多线程并发编程
一.线程池 1.1.什么是线程池 线程池是一种多线程的处理方式,利用已有线程对象继续服务新的任务(按照一定的执行策略),而不是频繁地创建销毁线程对象,由此提高服务的吞吐能力,减少CPU的闲置时间.具体 ...
- Java多线程并发编程--Java并发包(JUC)
Java多线程并发–Java并发包(JUC) 前言 前一篇文章中,笔者已经介绍了Java多线程的一些基础知识,但是想要成为一名中高级Java程序员还必须懂得Java并发包(JUC)的知识点,而且JUC ...
- 多线程---并发容器的使用
多线程---并发容器的使用 1. 容器概览 2. 容器的使用 1. Map 1. HashTable 2. HashMap 3. SynchronizedHashMap 4. ConcurrentHa ...
- Java 多线程 并发编程
转载自 Java 多线程 并发编程 一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进 ...
- java火箭应用_从火箭发场景来学习Java多线程并发闭锁对象
原标题:从火箭发场景来学习Java多线程并发闭锁对象 从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; ...
- java 闭锁_从火箭发场景来学习Java多线程并发闭锁对象
从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; 执行后,size-这种方式来实现.但是在多线程并发的情 ...
- 2021全新Java多线程并发入门到精通,一篇就能学会
目录 一, JAVA 多线程并发 1,JAVA 并发知识库 2,JAVA 线程实现/创建方式 (1) 继承 Thread 类 (2)实现 Runnable 接口. (3)ExecutorService ...
- Java多线程并发技术
Java多线程并发技术 参考文献: http://blog.csdn.net/aboy123/article/details/38307539 http://blog.csdn.net/ghsau/a ...
- delay在java中有什么用_DelayQueue怎么在Java多线程并发开发中使用
DelayQueue怎么在Java多线程并发开发中使用 发布时间:2020-12-05 17:29:31 来源:亿速云 阅读:56 作者:Leah 这篇文章给大家介绍DelayQueue怎么在Java ...
最新文章
- 【每日一算法】平衡二叉树
- 买了两本“博客园开发者征途”系列的书
- spingboot集成jpa(一)
- eclipse 全屏插件
- .NET Core快速入门教程 1、开篇:说说.NET Core的那些事儿
- 欢乐纪中某A组赛【2019.1.19】
- 【Java从入门到头秃专栏 】(三) 控制流程 Math Date DateFormat Calendar System BigDecimal Random
- JAVA中url的特殊字符处理及url转码解码
- python可以处理矩阵吗_Python 稀疏矩阵处理
- python编译exe运行慢_Python运行速度慢你知道这是为什么吗?
- android之统一字体大小
- python测试开发django-46.xadmin添加action动作
- react-native windows下环境搭建和现阶段开发测试问题汇总(持续更新)
- Implement queue with two stack 用两个堆实现队列
- java私塾跟我学系列_java 私塾作业
- OpenMP与C++ 事半功倍地获得多线程的好处 下
- xp系统禁止开机启动服务器,Window XP 开机启动超慢,哪些系统服务和进程可以禁用?...
- 实战小项目——基于STM32的蓝牙小车
- STM32F407传输OV2640视频数据并在PC端显示
- Monte Carlo Integration 蒙特卡罗方法求积分 附简单例题+代码
热门文章
- 考研计算机网络比较难还是数据结构,2015考研:历年计算机试卷结构与难度分析...
- mysql流量控制_Daloradius限制上网流量
- ST算法解决RMQ问题
- 网络编程释疑之:TCP的TIME_WAIT状态在服务器开发中的影响?
- live555 源码分析:基础设施
- 高级数据结构与算法 | 并查集(Union-Find)
- python selenium 鼠标移动到指定元素,并点击对应的元素
- Docker 部署不香吗?
- LVS+Keepalived实现负载均衡和双机热备
- Django模版(一)