zoukankan      html  css  js  c++  java
  • ConCurrentHashMap(基于jdk1.8源码)(转载来源https://segmentfault.com/a/1190000014380257)

    ConCurrentHashMap的底层是:散列表+红黑树,与HashMap是一样的。(不允许key和value是null值)

    • JDK1.8底层是散列表+红黑树
    • ConCurrentHashMap支持高并发的访问和更新,它是线程安全
    • 检索操作不用加锁,get方法是非阻塞的
    • key和value都不允许为null
    • 有了Hashtable为啥需要ConCurrentHashMap

      • Hashtable是在每个方法上都加上了Synchronized完成同步,效率低下。
      • ConcurrentHashMap通过在部分加锁利用CAS算法来实现同步。
      • CAS算法和volatile简单介绍

        在看ConCurrentHashMap源码之前,我们来简单讲讲CAS算法和volatile关键字

        CAS(比较与交换,Compare and swap) 是一种有名的无锁算法

        CAS有3个操作数

        • 内存值V
        • 旧的预期值A
        • 要修改的新值B

        当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做

        • 当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值(A和内存值V相同时,将内存值V修改为B),而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试(否则什么都不做)

        看了上面的描述应该就很容易理解了,先比较是否相等,如果相等则替换(CAS算法)

      • volatile经典总结:volatile仅仅用来保证该变量对所有线程的可见性,但不保证原子性
    • 小结:
      • 底层结构是散列表(数组+链表)+红黑树,这一点和HashMap是一样的。
      • Hashtable是将所有的方法进行同步,效率低下。而ConcurrentHashMap作为一个高并发的容器,它是通过部分锁定+CAS算法来进行实现线程安全的。CAS算法也可以认为是乐观锁的一种~
      • 在高并发环境下,统计数据(计算size...等等)其实是无意义的,因为在下一时刻size值就变化了。
      • get方法是非阻塞,无锁的。重写Node类,通过volatile修饰next来实现每次获取都是最新设置的值
      • ConcurrentHashMap的key和Value都不能为null
      • 详解参考:https://blog.csdn.net/u010723709/article/details/48007881
  • 相关阅读:
    OS快速开发必备
    YYmodel 郭耀源 底层分析
    UITableView使用总结和性能优化
    文件操作
    DOM解析
    SAX解析
    Gallery
    菜单(menu)
    计时器(Chronometer)、标签(TabHost)
    ListActivity
  • 原文地址:https://www.cnblogs.com/serendipity-fly/p/9334665.html
Copyright © 2011-2022 走看看