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 ...
随机推荐
- [洛谷P4626]一道水题 II
题目大意:求$lcm(1,2,3,\cdots,n)\pmod{100000007}$,$n\leqslant10^8$ 题解:先线性筛出质数,然后求每个质数最多出现的次数,可以用$\log_in$来 ...
- 解决Maven下载依赖慢
微服务spring boot,在使用maven下载依赖的时候非常慢,几十K的依赖JAR,也需要漫长的等待,更悲剧呢的漫长等待结果提示下载失败,为彻底解决这个问题,决定使用国内的镜像库,想象总是美好的, ...
- Spring Boot系列教程一:Eclipse安装spring-tool-suite插件
一.前言 一直使用eclipse,个人习惯选用Eclipse+spring-tool-suite进行开发,特别注意Eclipse要选用对应的spring-tool-suite进行安装,这 ...
- 【BZOJ1001】狼抓兔子(平面图转对偶图,最短路)
[BZOJ1001]狼抓兔子(平面图转对偶图,最短路) 题面 BZOJ 洛谷 题解 这题用最小割可以直接做 今天再学习了一下平面图转对偶图的做法 大致的思路如下: 1.将源点到汇点中再补一条不与任何线 ...
- 洛谷 P2123 皇后游戏 解题报告
P2123 皇后游戏 题意: 给定\(T\)组长为\(n\)的\(A\),\(B\)数组和\(C\)的计算方法,求一种排列方法,使最大的\(C\)最小化. 数据范围: \(1 \le T \le 10 ...
- MapReduce(五) mapreduce的shuffle机制 与 Yarn
一.shuffle机制 1.概述 (1)MapReduce 中, map 阶段处理的数据如何传递给 reduce 阶段,是 MapReduce 框架中最关键的一个流程,这个流程就叫 Shuffle:( ...
- 监听input内容改变的oninput与onpropertychange在ie9的bug
在做autocomplate的时候发现,ie9中,剪切.退格.删除不触发oninput事件,而ie9和ie9+已经移除了onpropertychange事件. 只好尝试添加退格.delete.剪切事件 ...
- 新的JavaScript数据结构Streams
最近在网上看到了一个新的 Javascript 小程序——Streams,起初以为是一个普通的 Javascript 类库,但读了关于它的介绍后,我发现,这不是一个简单的类库,而且作者的重点也不是这个 ...
- Codeforces Round #385 (Div. 2)A B C 模拟 水 并查集
A. Hongcow Learns the Cyclic Shift time limit per test 2 seconds memory limit per test 256 megabytes ...
- Python2和Python3共存安装
记录下: 先下载Python2.7.6,安装完成,不要添加到path中: 再下载Python3.4.3,安装,不要添加到path中. 进入 Python2: py -2 进入Python3: py - ...