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

ConCurrentHashMap(基于jdk1.8源码)(转载来源https://segmentfault.com/a/1190000014380257)的更多相关文章

  1. ConcurrentHashMap基于JDK1.8源码剖析

    前言 声明,本文用的是jdk1.8 前面章节回顾: Collection总览 List集合就这么简单[源码剖析] Map集合.散列表.红黑树介绍 HashMap就是这么简单[源码剖析] LinkedH ...

  2. 【集合框架】JDK1.8源码分析之HashMap(一) 转载

    [集合框架]JDK1.8源码分析之HashMap(一)   一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化 ...

  3. 【转载】MacOS下IntelliJ IDEA关联JDK1.8源码

    原文地址: MacOS下IntelliJ IDEA关联JDK1.8源码 1 打开jdk设置,找到具体添加的地方 2 找到自己jdk的源码位置替换掉 3 如果没有源码或者源码没有下载解压,自己下载解压, ...

  4. 【集合框架】JDK1.8源码分析HashSet && LinkedHashSet(八)

    一.前言 分析完了List的两个主要类之后,我们来分析Set接口下的类,HashSet和LinkedHashSet,其实,在分析完HashMap与LinkedHashMap之后,再来分析HashSet ...

  5. JDK1.8源码阅读系列之三:Vector

    本篇随笔主要描述的是我阅读 Vector 源码期间的对于 Vector 的一些实现上的个人理解,用于个人备忘,有不对的地方,请指出- 先来看一下 Vector 的继承图: 可以看出,Vector 的直 ...

  6. HashMap和ConcurrentHashMap实现原理及源码分析

    HashMap实现原理及源码分析 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表, ...

  7. 集合之TreeSet(含JDK1.8源码分析)

    一.前言 前面分析了Set接口下的hashSet和linkedHashSet,下面接着来看treeSet,treeSet的底层实现是基于treeMap的. 四个关注点在treeSet上的答案 二.tr ...

  8. 集合之LinkedHashSet(含JDK1.8源码分析)

    一.前言 上篇已经分析了Set接口下HashSet,我们发现其操作都是基于hashMap的,接下来看LinkedHashSet,其底层实现都是基于linkedHashMap的. 二.linkedHas ...

  9. 集合之HashSet(含JDK1.8源码分析)

    一.前言 我们已经分析了List接口下的ArrayList和LinkedList,以及Map接口下的HashMap.LinkedHashMap.TreeMap,接下来看的是Set接口下HashSet和 ...

随机推荐

  1. Codefroces 366 C Dima and Salad(dp)

    Dima and Salad 题意:一共有n种水果,每种水果都有一个ai, bi,现求一个最大的ai总和,使得ai之和/对应的bi之和的值等于K. 题解:将bi转换成偏移量,只要偏移到起点位置,就代表 ...

  2. Spring MVC 配置类 WebMvcConfigurerAdapter

    WebMvcConfigurerAdapter配置类是spring提供的一种配置方式,采用JavaBean的方式替代传统的基于xml的配置来对spring框架进行自定义的配置.因此,在spring b ...

  3. 【Nginx】简介以及安装、启动、关闭

    一.概述 二.Nginx基本安装 2.1 Windows安装Nginx Nginx目录结构 2.2 Linux安装Nginx 2.3 Mac利用homebrew安装 三.nginx启动关闭 3.1 重 ...

  4. moco 入门及问题解决

    废话不多说 下载: http://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/ 选择最新版本下载jar包 启动: 1:在本地jar包 ...

  5. Event Loop js 事件循环初理解

    浏览器环境 执行栈 所有的 JS 代码在运行是都是在执行上下文中进行的.执行上下文是一个抽象的概念,JS 中有三种执行上下文: 全局执行上下文,默认的,在浏览器中是 window 对象 函数执行上下文 ...

  6. Spring Boot跨域解决方案

    一.什么是跨域 为保证浏览器的安全,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源,这称之为同源策略,如果一个请求地址里的协议.域名.端口号都相同,就属于同源.依据浏览器同源策略,非同源脚 ...

  7. 基于redis(订阅发布)实现python和java进程间通信

    主要结构为: python进程发布消息,java进程订阅消息. 依赖环境: python:   pip install redis java:  jedis 1. python端: PubSub.py ...

  8. centos 7.x安装 jdk1.8

    参考链接即可:本人已经操作实现,才推荐出来 https://blog.csdn.net/weixin_42266606/article/details/80863781

  9. MySQL设计表规范

    规范总结 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用 MySQL 保留关键字[设计表后逐一排查] 所有表必须使用 Innodb 存储引擎,数据库和表的字符集统一使用 ...

  10. Day 25 网络基础2

    ip地址划分 ip地址由32位二进制组成. 什么是二进制?0101 10进制 0-9 10 2进制 0-1 10 二进制1100 ==1X2^3+1X2^2+0X2^1+0X2^0 =12 十进制15 ...