import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList; /**
* 集合在多线程中同步的方式:
* 1. Collections.synchronizedMap()
* 2. Hashtable锁机制: 将整个hash表锁起来,多线程的并行变成串行,多线程效率低
* 3. (优先选择)ConcurrentHashMap锁机制: 采用锁分段机制, 效率高, 锁分段实现线程的并行
* 结构 每1个ConcurrentHashMap默认有16个段(segment),
* 每1个段默认有16长度的哈希表
* 哈希表的每个桶位都有1个链表
* 每个段(segmeng)有独立的锁,不同段之间的线程可以并行, 默认16个段并行线程数量最高是16个
*
* 后期改进: 锁分段换成了无锁的效率更高的CAS算法(比较替换算法)
*
* 选择方式:
* 单线程集合 多线程中集合
* 1. HashMap ConcurrentHashMap
* 2. TreeMap ConcurrentSkipListMap
* 3. ArrayList CopyOnWriteArrayList 写入并复制
*
* CopyOnWriteArrayList: 添加操作多时,效率低,因为每次添加都会复制并创建新的集合,开销大
* 适合场景: 多线程并发迭代集合
*/
public class ConcurrenCollectionTest {
public static void main(String[] args) {
ArrayListTask listTask = new ArrayListTask(); for (int i = 0; i < 10; i++) {
new Thread(listTask).start();
} }
} class ArrayListTask implements Runnable{
//Collections.synchronizedList创建同步集合
// private static List<String> list = Collections.synchronizedList(new ArrayList <>()); private static CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList(); static {
list.add("AAA");
list.add("BBB");
list.add("CCC");
} @Override
public void run() {
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
//在迭代方法中, 往集合中添加元素出现ConcurrentModificationException异常
//集合集合添加操作和迭代器遍历操作使用的是同一个数据源(集合)
list.add("AAA");
} }
}

juc包下的集合类的更多相关文章

  1. juc包:使用 juc 包下的显式 Lock 实现线程间通信

    一.前置知识 线程间通信三要素: 多线程+判断+操作+通知+资源类. 上面的五个要素,其他三个要素就是普通的多线程程序问题,那么通信就需要线程间的互相通知,往往伴随着何时通信的判断逻辑. 在 java ...

  2. JUC(三):JUC包下锁概念

    线程不安全集合类 ArrayList List是线程不安全的集合类,底层是Object数组实现,初始化容量是10(其实是一个空数组,第一次扩容时,将数组扩容为10),其后每次扩容大小为当前容量的一半( ...

  3. JUC 包下工具类,它的名字叫 LockSupport !你造么?

    前言 LockSupport 是 JUC 中常用的一个工具类,主要作用是挂起和唤醒线程.在阅读 JUC 源码中经常看到,所以很有必要了解一下. 公众号:liuzhihangs ,记录工作学习中的技术. ...

  4. 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore

    前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行 ...

  5. java多线程系列11 juc包下的队列

    队列分为两类  阻塞队列 BlockingQueue提供如下两个支持阻塞的方法:   (1)put(E e): 尝试把e元素放如BlockingQueue中,如果该队列的元素已满,则阻塞该线程.   ...

  6. JUC包下CyclicBarrier学习笔记

    CyclicBarrier,一个同步辅助类,在API中是这么介绍的: 它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这 ...

  7. juc包下四大并发工具

    juc.CountDownLatch 闭锁 一个线程在等待一组线程后再恢复执行 await()等待其他线程执行完毕 被等待线程执行完毕后计数器-1 如何知道其他线程执行完了? 计数器,若一组线程为,C ...

  8. JUC包下Semaphore学习笔记

    在Java的并发包中,Semaphore类表示信号量.Semaphore内部主要通过AQS(AbstractQueuedSynchronizer)实现线程的管理.Semaphore有两个构造函数,参数 ...

  9. JUC包下CountDownLatch学习笔记

    CountDownLatch的作用是能使用多个线程进来之后,且线程任务执行完毕之后,才执行, 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于 ...

随机推荐

  1. UVA557 汉堡 Burger

    题面 https://www.luogu.org/problemnew/show/UVA557 这里顺便整理一下二维格点随机游走问题. 遇到这种问题时,需注意分母的计算问题. 设x为起点到终点的距离. ...

  2. gradle 编译 No such property: sonatypeUsername错误解决

    No such property: sonatypeUsername for class: org.gradle.api.publication.maven.internal.ant.DefaultG ...

  3. bzoj4589: Hard Nim fwt

    题意:求n个m以内的素数亦或起来为0的方案数 题解:fwt板子题,先预处理素数,把m以内素数加一遍(下标),然后fwt之后快速幂即可,在ifwt之后a[0]就是答案了 /*************** ...

  4. OC id类型

    id数据类型可存储任何类型的对象.从某种意义说,它是一般对象类型. -------------------------"NormalMan.h"------------------ ...

  5. spark streaming 入门例子

    spark streaming 入门例子: spark shell import org.apache.spark._ import org.apache.spark.streaming._ sc.g ...

  6. spark 任务运行原理

    调优概述 在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以 ...

  7. css 页面定位position

    position的四个属性值 relative absolute fixed static 参看实例 <div id="parent">  <div id='su ...

  8. sgu106.The equation 拓展欧几里得 难度:0

    106. The equation time limit per test: 0.25 sec. memory limit per test: 4096 KB There is an equation ...

  9. eclipse中使用Maven新建Servlet2.5的Web项目

    前言 我们用Eclipse创建Maven结构的web项目的时候选择了Artifact Id为maven-artchetype-webapp,由于这个catalog比较老,用的servlet还是2.3的 ...

  10. 关于python课程的想法和建议。

    第一次听说python是在刚结束与世隔绝的高中生活之后,当时的网络上铺天遍地都是人工智能和机器学习,于是便知道了python这门编程语言.我是光电信息科学与工程专业的学生,这个专业的学生必须要懂计算机 ...