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. Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level

    2018-03-23 18:32:21,690 [INFO] [http-nio-11007-exec-2] org.apache.coyote.http11.Http11Processor [Dir ...

  2. OC description和sel

    一.description方法 Description方法包括类方法和对象方法.(NSObject类所包含) (一)基本知识 -description(对象方法) 使用NSLog和@%输出某个对象时, ...

  3. kill word out 1

    1● de 使~~ 成为 :离开 ,去掉,向下,变慢   2● dif 不,分开 ,否定,离开     3● deci 十分之一   4● deca 向下,离开   5● deca 十   6● di ...

  4. js数组去重的几种方法

    1.遍历数组法 最简单的去重方法, 实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中:注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持 ...

  5. POJ 1847 Floyd_wshall算法

    前面用dijstra写过了.但是捏.数据很小.也可以用Floyd来写. 注意题目里给出的是有向的权值. 附代码:#include<stdio.h>#include<string.h& ...

  6. node.js express 4.x 安装指南 (找了很久呀,痛苦之路)

    问题出现这,版本的问题,还有express4.0以上的版本启动node app.js指令的变更,蛋疼.参考这个

  7. POJ 3579 median 二分搜索,中位数 难度:3

    Median Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3866   Accepted: 1130 Descriptio ...

  8. 51nod算法马拉松28-c

    题解: 按照每一个要求,分类讨论,讨论压下去了多少 代码: #include<bits/stdc++.h> using namespace std; ,N=; int n,A,B,C,an ...

  9. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...

  10. Ant里面神奇的fork

    最近两天一直在处理ant运行java程序的一个问题,用IDE直接运行类里面的main函数一切正常,但用ant跑该函数就报错误,错误的原因是运行ant任务时调用的是AntClasloader,而IDE里 ...