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. boruvka算法

    算法正确性证明: 1.最优性:最小边一定包含在生成树中. 2.合法性:一定不会构成环.如果存在环说明一个点的最小连边有两个,显然矛盾. 算法时间复杂度证明: 每执行一次算法,所有联通块的大小都至少为2 ...

  2. SAS/SATA/SSD/IDE硬盘介绍区别

    SAS/SATA/SSD/IDE硬盘介绍区别 SAS(Serial Attached SCSI)即串行连接SCSI,是新一代的SCSI技术,和现在流行的Serial ATA(SATA)硬盘相同,都是采 ...

  3. python 多线程稀疏矩阵乘法

    import threading, time import numpy as np res = [] class MyThread(threading.Thread): def __init__(se ...

  4. python-day68--模型层基础(model)

    一.ORM : object relationship mapping   对象映射关系 映射关系: 表名 <-------> 类名 字段 <-------> 属性 表记录 & ...

  5. OAF 标准的供应商管理员批准流程

    标准供应商审批流程 oracle.apps.pos.onboard.webui.FlexRegApproverPGCO--初始化poplist LinkedList actionListText = ...

  6. iOS UI-九宫格

    第一节课: .复习 .运行App应用管理,简单界面分析 .一个应用为一个整体,直接创建一个appView然后计算frame .说明弊端,应该根据数据的个数来for循环创建 第二节课: .加载plist ...

  7. 如何用Curl 来post xml 数据

    因为登陆服务升级,密码策略变更,以前的测试脚本中的用户密码已经不能登陆,试图通过API直接更改密码,一种是直接update,一种是change,使用curl的时候均未成功. 最后索性重新用curl命令 ...

  8. Python简单网页爬虫——极客学院视频自动下载

    http://blog.csdn.net/supercooly/article/details/51003921

  9. 014PHP文件处理——文件指针控制fseek rewind ftell feof fpassthru

    <?php /** * 文件指针控制fseek rewind ftell feof fpassthru */ //feof()判断文件读取是否超出文件长度 /*$file = fopen('a. ...

  10. this常见错误

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...