您现在的位置是:首页 > 文章详情

3.JUC线程高级-同步容器 ConcurrentHashMap

日期:2018-09-03点击:469

Java5.0 在java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。

  • ConcurrentHashMap 同步容器类是Java5 增加的一个线程安全的哈希表。对于多线程的操作,介于HashMap与Hashtable之间。内部采用锁分段机制代替Hashtable 的独占锁。进而提高性能。
  • 此包还提供了设计用于多线程上下文中的Collection 实现:
    ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList 和 CopyOnWriteArraySet。
  • 当期望许多线程访问一个给定 collection 时,ConcurrentHashMap 通常优于同步的 HashMap,ConcurrentSkipListMap 通常优于同步的 TreeMap。
  • 当期望的数和遍历远远大于列表的更新数时,CopyOnWriteArrayList 优与同步的 ArrayList。

1. Hashtable 之所以效率低下的原因:

内部使用独占锁机制,特别是遇到大量的复合操作时效率就会很低。

img_06820150b13928285ef6426ecddade31.png

2. ConcurrentHashMap 采用 锁分段 机制:

concurrentLevel分段级别,默认16段(segment)

img_537aa6f6499bed631d373de7543f6d09.png

这里每个分段都是一个独立的锁,这就意味着多个线程并发访问时并行执行,效率瞬间就高了。并且该类内部也提供了一些复合操作的方法。

在JDK1.8之后,jvm底层将ConcurrentHashMap底层的分段锁转换为了 CAS(不会阻塞,不涉及上下文交互) 机制

3. CopyOnWrite 写入并复制

在此之前我们模拟并发修改异常情况:在遍历集合时为集合添加元素

package com.pyy.juc; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; public class TestCopyOnWriteArrayList { public static void main(String[] args) { HelloThread ht = new HelloThread(); for(int i = 0; i < 10; i++) { new Thread(ht).start(); } } } class HelloThread implements Runnable { private static List<String> list = Collections.synchronizedList(new ArrayList<String>()); static { list.add("AA"); list.add("BB"); list.add("CC"); } @Override public void run() { Iterator<String> it = list.iterator(); while(it.hasNext()) { System.out.println(it.next()); list.add("AA"); } } } 

结果:报并发修改异常java.util.ConcurrentModificationException

java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) at java.util.ArrayList$Itr.next(ArrayList.java:851) at com.pyy.juc.HelloThread.run(TestCopyOnWriteArrayList.java:35) at java.lang.Thread.run(Thread.java:745) 

如果遇到这样的操作我们可以使用 CopyOnWriteArrayList 并发容器类解决这问题:这个类的底层会在你执行写入之前先复制出一个新的列表再执行写入。
注意:

  • 添加操作多时,效率低,因为每次添加都会进行复制,开销非常大。
  • 适用于迭代(遍历操作)多,同时又考虑并发安全可以使用
原文链接:https://yq.aliyun.com/articles/636327
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章