一个不安全的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相关推荐

  1. java 计时器_Java多线程并发容器之并发倒计时器

    从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; 执行后,size-这种方式来实现.但是在多线程并发的情 ...

  2. Java多线程并发编程

    一.线程池 1.1.什么是线程池 线程池是一种多线程的处理方式,利用已有线程对象继续服务新的任务(按照一定的执行策略),而不是频繁地创建销毁线程对象,由此提高服务的吞吐能力,减少CPU的闲置时间.具体 ...

  3. Java多线程并发编程--Java并发包(JUC)

    Java多线程并发–Java并发包(JUC) 前言 前一篇文章中,笔者已经介绍了Java多线程的一些基础知识,但是想要成为一名中高级Java程序员还必须懂得Java并发包(JUC)的知识点,而且JUC ...

  4. 多线程---并发容器的使用

    多线程---并发容器的使用 1. 容器概览 2. 容器的使用 1. Map 1. HashTable 2. HashMap 3. SynchronizedHashMap 4. ConcurrentHa ...

  5. Java 多线程 并发编程

    转载自  Java 多线程 并发编程 一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进 ...

  6. java火箭应用_从火箭发场景来学习Java多线程并发闭锁对象

    原标题:从火箭发场景来学习Java多线程并发闭锁对象 从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; ...

  7. java 闭锁_从火箭发场景来学习Java多线程并发闭锁对象

    从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; 执行后,size-这种方式来实现.但是在多线程并发的情 ...

  8. 2021全新Java多线程并发入门到精通,一篇就能学会

    目录 一, JAVA 多线程并发 1,JAVA 并发知识库 2,JAVA 线程实现/创建方式 (1) 继承 Thread 类 (2)实现 Runnable 接口. (3)ExecutorService ...

  9. Java多线程并发技术

    Java多线程并发技术 参考文献: http://blog.csdn.net/aboy123/article/details/38307539 http://blog.csdn.net/ghsau/a ...

  10. delay在java中有什么用_DelayQueue怎么在Java多线程并发开发中使用

    DelayQueue怎么在Java多线程并发开发中使用 发布时间:2020-12-05 17:29:31 来源:亿速云 阅读:56 作者:Leah 这篇文章给大家介绍DelayQueue怎么在Java ...

最新文章

  1. 【每日一算法】平衡二叉树
  2. 买了两本“博客园开发者征途”系列的书
  3. spingboot集成jpa(一)
  4. eclipse 全屏插件
  5. .NET Core快速入门教程 1、开篇:说说.NET Core的那些事儿
  6. 欢乐纪中某A组赛【2019.1.19】
  7. 【Java从入门到头秃专栏 】(三) 控制流程 Math Date DateFormat Calendar System BigDecimal Random
  8. JAVA中url的特殊字符处理及url转码解码
  9. python可以处理矩阵吗_Python 稀疏矩阵处理
  10. python编译exe运行慢_Python运行速度慢你知道这是为什么吗?
  11. android之统一字体大小
  12. python测试开发django-46.xadmin添加action动作
  13. react-native windows下环境搭建和现阶段开发测试问题汇总(持续更新)
  14. Implement queue with two stack 用两个堆实现队列
  15. java私塾跟我学系列_java 私塾作业
  16. OpenMP与C++ 事半功倍地获得多线程的好处 下
  17. xp系统禁止开机启动服务器,Window XP 开机启动超慢,哪些系统服务和进程可以禁用?...
  18. 实战小项目——基于STM32的蓝牙小车
  19. STM32F407传输OV2640视频数据并在PC端显示
  20. Monte Carlo Integration 蒙特卡罗方法求积分 附简单例题+代码

热门文章

  1. 考研计算机网络比较难还是数据结构,2015考研:历年计算机试卷结构与难度分析...
  2. mysql流量控制_Daloradius限制上网流量
  3. ST算法解决RMQ问题
  4. 网络编程释疑之:TCP的TIME_WAIT状态在服务器开发中的影响?
  5. live555 源码分析:基础设施
  6. 高级数据结构与算法 | 并查集(Union-Find)
  7. python selenium 鼠标移动到指定元素,并点击对应的元素
  8. Docker 部署不香吗?
  9. LVS+Keepalived实现负载均衡和双机热备
  10. Django模版(一)