前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3.JUC线程高级-同步容器 ConcurrentHashMap

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

作者头像
用户1212940
发布2022-04-13 15:03:45
2040
发布2022-04-13 15:03:45
举报
文章被收录于专栏:Lambda

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 之所以效率低下的原因:

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

11464886-e002de72b4fc3899.png
11464886-e002de72b4fc3899.png

2. ConcurrentHashMap 采用 锁分段 机制:

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

11464886-c3079d3a0dae1034.png
11464886-c3079d3a0dae1034.png

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

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

3. CopyOnWrite 写入并复制

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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 并发容器类解决这问题:这个类的底层会在你执行写入之前先复制出一个新的列表再执行写入。 注意:

  • 添加操作多时,效率低,因为每次添加都会进行复制,开销非常大。
  • 适用于迭代(遍历操作)多,同时又考虑并发安全可以使用
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/09/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Hashtable 之所以效率低下的原因:
  • 2. ConcurrentHashMap 采用 锁分段 机制:
  • 3. CopyOnWrite 写入并复制
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档