java并发容器
同步容器将所有对容器状态的访问都串行化,以实现线程安全性。这种方式的缺点是严重降低并发性。Java 5.0提供了多种并发容器来改进同步容器的性能。如ConcurrentHashMap代替同步且基于散列的Map,CopyOnWriteArrayList,用于在遍历操作主要操作的情况下代替同步的List,同时提供了一些常见的符合操作,如,若没有则添加,替换及有条件删除等。Java 6引入了ConcurrentSckipListMap和ConcurrentSkipListSet,分别代替同步的SortedMap和SortedSet。
通过并发容器来代替同步容器,可以极大地提高性能并降低风险。
ConcurrentHashMap
同步容器类在执行每个操作期间都持有锁。在一些操作,如HashMap.get和List.contains,可能包含大量工作:遍历散列表或链表来查找特定的对象,必须调用equals方法。这将花费大量时间,而其他线程在这段时间将不能访问该容器。
ConcurrentHashMap 也是基于散列的Map,并不是将每个方法都在同一个锁上同步并使每次只有一个线程访问容器,而是使用一种粒度更细的加锁机制来实现各大程度的共享,这种机制称为分段锁。任意数量的读取线程可以并发的访问Map,执行读取操作的线程和执行写入操作的线程可以并发的访问Map,并且一定数量的写入线程可以并发的修改Map。
类似的并发容器增强了同步容器,它们提供的迭代器不会抛出ConcurrentModeficationException,因此不需要在迭代过程加锁。 ConcurrentHashMap 返回的迭代器具有弱一致性,可以容忍并发的修改,当创建迭代器时会遍历已有的元素,并可以在迭代器被构造后将修改操作反映给容器。
尽管并发容器改进很多,但是还存在需要权衡的因素,对于需要在整个map上计算的方法,如size和isEmpty,这些方法返回的结果可能已经过期了,实际上只是估计值。虽然这个看上去存在很大问题,实际上在并发环境下,这些方法作用很小,因为他们的值一直在变。这些操作的弱化换取其他更重要操作的性能优化,如get,put,containsKey和remove等。
与Hashtable和synchronizedMap相比, ConcurrentHashMap有着更多的优势及更少的劣势,因此在大多数情况下使用 ConcurrentHashMap代替同步Map能进一步提高代码的可伸缩性。只有需要加锁Map进行独占访问时才应该放弃 ConcurrentHashMap。
由于 ConcurrentHashMap不能被加锁来执行独占访问,因此无法使用客户端加锁建立新的原子操作,但是一些常见的复合操作已经实现为原子操作。
CopyOnWriteArrayList
CopyOnWriteArrayList 用于替代同步List,在某些情况下提供更好的并发性能。并且迭代期间不需要加锁或者复制。线程安全性在于,“写入时复”制,每次修改时都会创建并重新发布一个新的容器副本。“写入时复制”容器的迭代器保留一个指向底层基础数组的引用,这个数组位于迭代器的起始位置,由于不会被修改,因此同步时只需确保数组内容的可见性。多个线程可以对这个容器进行迭代。容器的迭代器返回的元素与迭代器创建时的元素完全一致。
每当修改容器时都会复制底层数组,这需要一定的开销,特别是规模较大时。仅当迭代操作远大于修改操作时,才应该使用"写入时复制"容器。类似的还有CopyOnWriteArraySet。如用于事件通知系统,注册和注销事件的操作远少于接受事件的操作。
java并发容器的更多相关文章
- java 并发容器一之BoundedConcurrentHashMap(基于JDK1.8)
最近开始学习java并发容器,以补充自己在并发方面的知识,从源码上进行.如有不正确之处,还请各位大神批评指正. 前言: 本人个人理解,看一个类的源码要先从构造器入手,然后再看方法.下面看Bounded ...
- Java并发编程系列-(5) Java并发容器
5 并发容器 5.1 Hashtable.HashMap.TreeMap.HashSet.LinkedHashMap 在介绍并发容器之前,先分析下普通的容器,以及相应的实现,方便后续的对比. Hash ...
- Java 并发系列之六:java 并发容器(4个)
1. ConcurrentHashMap 2. ConcurrentLinkedQueue 3. ConcurrentSkipListMap 4. ConcurrentSkipListSet 5. t ...
- 《Java并发编程的艺术》第6/7/8章 Java并发容器与框架/13个原子操作/并发工具类
第6章 Java并发容器和框架 6.1 ConcurrentHashMap(线程安全的HashMap.锁分段技术) 6.1.1 为什么要使用ConcurrentHashMap 在并发编程中使用Has ...
- java并发容器(Map、List、BlockingQueue)
转发: 大海巨浪 Java库本身就有多种线程安全的容器和同步工具,其中同步容器包括两部分:一个是Vector和Hashtable.另外还有JDK1.2中加入的同步包装类,这些类都是由Collectio ...
- java并发容器(Map、List、BlockingQueue)具体解释
Java库本身就有多种线程安全的容器和同步工具,当中同步容器包含两部分:一个是Vector和Hashtable.另外还有JDK1.2中增加的同步包装类.这些类都是由Collections.synchr ...
- Java并发容器--ConcurrentHashMap
引子 1.不安全:大家都知道HashMap不是线程安全的,在多线程环境下,对HashMap进行put操作会导致死循环.是因为多线程会导致Entry链表形成环形数据结构,这样Entry的next节点将永 ...
- 【java并发容器】并发容器之CopyOnWriteArrayList
原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容 ...
- 14个Java并发容器,你用过几个?
作者:acupt 前言 不考虑多线程并发的情况下,容器类一般使用ArrayList.HashMap等线程不安全的类,效率更高.在并发场景下,常会用到ConcurrentHashMap.ArrayBlo ...
随机推荐
- BZOJ4916 神犇和蒟蒻(欧拉函数+杜教筛)
第一问是来搞笑的.由欧拉函数的计算公式容易发现φ(i2)=iφ(i).那么可以发现φ(n2)*id(n)(此处为卷积)=Σd*φ(d)*(n/d)=nΣφ(d)=n2 .这样就有了杜教筛所要求的容易算 ...
- Frequent values UVA - 11235(巧妙地RMQ)
题意: 给出一个非降序排列的整数数组a1.a2,······,an,你的任务是对于一系列询问(i,j),回答ai,ai+1,······,aj中出现次数最多的值所出现的次数 解析: 白书p198 其实 ...
- 洛谷P1602 Sramoc问题 题解报告【同余+bfs】
题目描述 话说员工们整理好了筷子之后,就准备将快餐送出了,但是一看订单,都傻眼了:订单上没有留电话号码,只写了一个sramoc(k,m)函数,这什么东西?什么意思?于是餐厅找来了资深顾问团的成员,YQ ...
- CODECHEF Chef and Churus 解题报告
[CODECHEF]Chef and Churus Description 有一个长度为\(n\)的数组\(A\),有\(n\)个函数,第\(i\)个函数的值为\(\sum_{j=l_i}^{r_i} ...
- 洛谷 P4066 [SHOI2003]吃豆豆 解题报告
P4066 [SHOI2003]吃豆豆 题目描述 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的路线很奇怪 ...
- Zookeeper(一) zookeeper基础使用
一.Zookeeper是什么 (安装的是3.4.7) ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现.它提供了简单原始的功能, ...
- JavaScript的变量预解析特性
JavaScript是解释型语言是毋庸置疑的,但它是不是仅在运行时自上往下一句一句地解析的呢?事实上或某种现象证明并不是这样的,通过<JavaScript权威指南>及网上相关资料了解到,J ...
- Myeclipse下更改所有jsp、html文件的编码
windows-->>preferences-->>gengral-->>
- Codeforces Round #286 (Div. 2) B 并查集
B. Mr. Kitayuta's Colorful Graph time limit per test 1 second memory limit per test 256 megabytes in ...
- CDOJ--1369
原题链接:http://acm.uestc.edu.cn/problem.php?pid=1369&cid=192 分析:DP,dp[i][0]表示第i个人不是lover时的最小值,dp[i] ...