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. Jon Snow and his Favourite Number CodeForces - 768C (技巧)

    链接 题意 给定数组, 每次操作先将数组排序, 再将奇数位全部异或x, 求k次操作后数组最大值与最小值 (1 ≤ n ≤ 105, 0 ≤ k ≤ 105, 0 ≤ x ≤ 103) 题解 直接暴力模 ...

  2. 『cs231n』作业3问题2选讲_通过代码理解LSTM网络

    LSTM神经元行为分析 LSTM 公式可以描述如下: itftotgtctht=sigmoid(Wixxt+Wihht−1+bi)=sigmoid(Wfxxt+Wfhht−1+bf)=sigmoid( ...

  3. 使用与不使用@RequestBody注解的区别

    1. 如果使用@RequestBody接受页面参数: public Map<String,Object> insertBudget(@ApiParam(required = true,na ...

  4. matplotlib.pyplot 绘制图形

    收集的一些觉得非常有用的绘图的资料: Python--matplotlib绘图可视化知识点整理 matplotlib.pyplot matplotlib gallery

  5. android升级adt和sdk之后无法识别SDK Location的一个解决方式

    我把android的adt和sdk从4.0升级到4.2,发现eclipse的android设置里面原来列出的各种api level的platform消失了,而且无法新建android工程.而且检查过了 ...

  6. ShiroFilterFactoryBean 处理拦截资源文件问题(Shiro权限管理)

    一.需要定义ShiroFilterFactoryBean()方法,而ShiroFilterFactoryBean.class是实现了FactoryBean和BeanPostProcessor接口: 1 ...

  7. POJ 2263 最短路Floyd_warshall算法

    灰常开心的用Floyd变形写出来了.额.对米来说还是牺牲了一定的脑细胞的.然而.我发现.大牛们还可以神奇的用Kruskal求最大生成树的最小权值来写.也可以用Dijkatra变形来写.T_T....5 ...

  8. Winform中用comboBox来选择显示Dataset中表格数据

    这是一次偷懒的尝试,因为每次都必须打开代码,调试才能看见数据,发现问题.也是借鉴了调试中查看dataset数据的模式,查看不同表格.经历一番研究,总算实现了想要的效果了,故作此一笔记.与人共享. 界面 ...

  9. 推荐十款java开源中文分词组件

    1:Elasticsearch的开源中文分词器 IK Analysis(Star:2471) IK中文分词器在Elasticsearch上的使用.原生IK中文分词是从文件系统中读取词典,es-ik本身 ...

  10. python 数据科学

    参考资料: https://www.yiibai.com/python_data_science/python_bubble_charts.html