juc包下的集合类
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包下的集合类的更多相关文章
- juc包:使用 juc 包下的显式 Lock 实现线程间通信
一.前置知识 线程间通信三要素: 多线程+判断+操作+通知+资源类. 上面的五个要素,其他三个要素就是普通的多线程程序问题,那么通信就需要线程间的互相通知,往往伴随着何时通信的判断逻辑. 在 java ...
- JUC(三):JUC包下锁概念
线程不安全集合类 ArrayList List是线程不安全的集合类,底层是Object数组实现,初始化容量是10(其实是一个空数组,第一次扩容时,将数组扩容为10),其后每次扩容大小为当前容量的一半( ...
- JUC 包下工具类,它的名字叫 LockSupport !你造么?
前言 LockSupport 是 JUC 中常用的一个工具类,主要作用是挂起和唤醒线程.在阅读 JUC 源码中经常看到,所以很有必要了解一下. 公众号:liuzhihangs ,记录工作学习中的技术. ...
- 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore
前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行 ...
- java多线程系列11 juc包下的队列
队列分为两类 阻塞队列 BlockingQueue提供如下两个支持阻塞的方法: (1)put(E e): 尝试把e元素放如BlockingQueue中,如果该队列的元素已满,则阻塞该线程. ...
- JUC包下CyclicBarrier学习笔记
CyclicBarrier,一个同步辅助类,在API中是这么介绍的: 它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这 ...
- juc包下四大并发工具
juc.CountDownLatch 闭锁 一个线程在等待一组线程后再恢复执行 await()等待其他线程执行完毕 被等待线程执行完毕后计数器-1 如何知道其他线程执行完了? 计数器,若一组线程为,C ...
- JUC包下Semaphore学习笔记
在Java的并发包中,Semaphore类表示信号量.Semaphore内部主要通过AQS(AbstractQueuedSynchronizer)实现线程的管理.Semaphore有两个构造函数,参数 ...
- JUC包下CountDownLatch学习笔记
CountDownLatch的作用是能使用多个线程进来之后,且线程任务执行完毕之后,才执行, 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于 ...
随机推荐
- yarn的淘宝镜像
现在有很多人使用npm但是很多人也开始使用了更快的更方便额的yarn,可是yarn也有下载速度慢,容易被墙的担忧~又不能像npm那样直接安装淘宝镜像,所以就有了更改yarn的yarn源~ yarn c ...
- hdu-3276-dp+二分+单调队列
Star Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 高精度减法用string 和 stack
#include "bits/stdc++.h" using namespace std; int main() { string a,b; while(cin >> ...
- Error when clicking other button after displaying Popup window(转)
原文地址:Error when clicking other button after displaying Popup window Hi, I'm developing a custom page ...
- POJ 3176 Cow Bowling(dp)
POJ 3176 Cow Bowling 题目简化即为从一个三角形数列的顶端沿对角线走到底端,所取得的和最大值 7 * 3 8 * 8 1 0 * 2 7 4 4 * 4 5 2 6 5 该走法即为最 ...
- UVALive 5107 dfs暴力搜索
题目链接:A hard Aoshu Problem DES:给三个字符串,包含的字符是A-E范围内的.长度都不超过8.每个字符可以而且只可以匹配一个数字.两个字符不能匹配相同的数字.前两个式子之间可以 ...
- custom usb-seriel udev relus for compatible usb-seriel devices using kermit
custom usb-seriel udev relus for compatible usb-seriel devices add-pl2303.rules: ACTION== "add& ...
- Solr安装入门
Solr安装入门:http://www.importnew.com/12607.html 查询详解:http://www.360doc.com/content/14/0306/18/203871_35 ...
- php通过$_SERVER['HTTP_USER_AGENT']获取浏览器useAgent
php通过$_SERVER['HTTP_USER_AGENT']获取浏览器useAgent
- MyEclipse WebSphere开发教程:安装和更新WebSphere 6.1, JAX-WS, EJB 3.0(六)
[周年庆]MyEclipse个人授权 折扣低至冰点!立即开抢>> [MyEclipse最新版下载] MyEclipse支持Java EE技术(如JAX-WS和EJB 3.0),它们以功能包 ...