转载请注明出处:http://blog.csdn.net/crazy1235/article/details/76795383


JDK 1.5 引入了 ConcurrentHashMap

ConcurrentHashMap是线程安全且高效的HashMap。

HashTable容器使用synchronized来保证线程安全,但是在线程竞争激烈的情况下,HashTable的效率非常低。

当一个线程访问 HashTable 的同步方法时,其他线程也无法访问其他的同步方法,这样效率就很低下。

ConcurrentHashMap它采锁分段技术 来保证高效的并发操作!

ConcurrentHashMap把容器分为多个 segment(片段) ,每个片段有一把锁,当多线程访问容器里不同数据段的数据时,线程间就不会存在竞争关系;一个线程占用锁访问一个segment的数据时,并不影响另外的线程访问其他segment中的数据。

构造函数

  1. static final int DEFAULT_INITIAL_CAPACITY = 16;
  2. static final float DEFAULT_LOAD_FACTOR = 0.75f;
  3. static final int DEFAULT_CONCURRENCY_LEVEL = 16;
  4. static final int MAXIMUM_CAPACITY = 1 << 30;
  5. static final int MIN_SEGMENT_TABLE_CAPACITY = 2;
  6. static final int MAX_SEGMENTS = 1 << 16;
  7. static final int RETRIES_BEFORE_LOCK = 2;
  1. public ConcurrentHashMap() {
  2. this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR, DEFAULT_CONCURRENCY_LEVEL);
  3. }
  1. public ConcurrentHashMap(int initialCapacity) {
  2. this(initialCapacity, DEFAULT_LOAD_FACTOR, DEFAULT_CONCURRENCY_LEVEL);
  3. }
  1. public ConcurrentHashMap(int initialCapacity, float loadFactor) {
  2. this(initialCapacity, loadFactor, DEFAULT_CONCURRENCY_LEVEL);
  3. }
  1. @SuppressWarnings("unchecked")
  2. public ConcurrentHashMap(int initialCapacity,
  3. float loadFactor, int concurrencyLevel) {
  4. if (!(loadFactor > 0) || initialCapacity < 0 || concurrencyLevel <= 0)
  5. throw new IllegalArgumentException();
  6. if (concurrencyLevel > MAX_SEGMENTS)
  7. concurrencyLevel = MAX_SEGMENTS;
  8. // Find power-of-two sizes best matching arguments
  9. int sshift = 0;
  10. int ssize = 1;
  11. while (ssize < concurrencyLevel) {
  12. ++sshift;
  13. ssize <<= 1;
  14. }
  15. this.segmentShift = 32 - sshift;
  16. this.segmentMask = ssize - 1;
  17. if (initialCapacity > MAXIMUM_CAPACITY)
  18. initialCapacity = MAXIMUM_CAPACITY;
  19. int c = initialCapacity / ssize;
  20. if (c * ssize < initialCapacity)
  21. ++c;
  22. int cap = MIN_SEGMENT_TABLE_CAPACITY;
  23. while (cap < c)
  24. cap <<= 1;
  25. // create segments and segments[0]
  26. Segment<K,V> s0 =
  27. new Segment<K,V>(loadFactor, (int)(cap * loadFactor),
  28. (HashEntry<K,V>[])new HashEntry[cap]);
  29. Segment<K,V>[] ss = (Segment<K,V>[])new Segment[ssize];
  30. UNSAFE.putOrderedObject(ss, SBASE, s0); // ordered write of segments[0]
  31. this.segments = ss;
  32. }

https://my.oschina.net/hosee/blog/639352

http://blog.csdn.net/javazejian/article/details/76167357

https://my.oschina.net/hosee/blog/607677

http://www.importnew.com/22007.html

http://blog.csdn.net/xuefeng0707/article/details/40834595

http://www.cnblogs.com/ITtangtang/p/3948786.html

http://www.importnew.com/21781.html

http://www.importnew.com/15845.html

ConcurrentHashMap 分析的更多相关文章

  1. jdk8 ConcurrentHashMap分析

    ConcurrentHashMap分析 tryPresize() transfer() putVal() addCount() sumCount() class ConcurrentHashMap { ...

  2. 基于JDK1.8的ConcurrentHashMap分析

    之前看过ConcurrentHashMap的分析,感觉也了解的七七八八了.但昨晚接到了面试,让我把所知道的ConcurrentHashMap全部说出来. 然后我结结巴巴,然后应该毫无意外的话就G了,今 ...

  3. java源码-ConcurrentHashMap分析-1

    ConcurrentHashMap源码分析 版本jdk8 摈弃了jdk7之前的segement段锁: 首先分析一下put方法,大致的流程就是首先对key取hash函数 判断是否first节点是否存在 ...

  4. ConcurrentHashMap分析

    1.ConcurrentHashMap锁分段技术                     ConcurrentHashMap使用锁分段技术,首先将数据分成一段一段地存储,然后给每一段数据配一把锁,当一 ...

  5. Java并发集合(三)-ConcurrentHashMap分析和使用

    1 http://ifeve.com/hashmap-concurrenthashmap-%E7%9B%B8%E4%BF%A1%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87% ...

  6. Java 容器源码分析之Map-Set-List

    HashMap 的实现原理 HashMap 概述 HashMap 是基于哈希表的 Map 接口的非同步实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.此类不保证映射的顺序 ...

  7. ConcurrentHashMap 的实现原理

    概述 我们在之前的博文中了解到关于 HashMap 和 Hashtable 这两种集合.其中 HashMap 是非线程安全的,当我们只有一个线程在使用 HashMap 的时候,自然不会有问题,但如果涉 ...

  8. 聊聊并发——深入分析ConcurrentHashMap

    术语定义 术语 英文 解释 哈希算法 hash algorithm 是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值. 哈希表 hash table 根据设定的哈希函数H(key ...

  9. Java---ConcurrentHashMap分析

    这是第二次分析concurrentHashMap 先回顾一下 1.concurrentHashMap是在jdk1.5版本之后推出的,位于java.util.concurrent包中. 2.基于Hash ...

随机推荐

  1. 江苏新美星智能物流无人叉车AGV

    新美星一家全球领先的液体包装解决方案供应商,高附加值的产品应用于食品饮料等行业,为液体食品和自动化系统提供完整解决方案.新美星,于CBST2017展会首次亮相了能够从仓库或工厂的某个地方把材料.托盘和 ...

  2. WCF For Silverlight跨域策略

    在WCF的根目录下添加跨域文件 <?xml version="1.0" encoding="utf-8" ?> <access-policy& ...

  3. jvm之gc日志

    ava GC日志可以通过 +PrintGCDetails开启 以ParallelGC为例 YoungGC日志解释如下 FullGC:

  4. Atcoder CADDi 2018 Solution

    C - Product and GCD Solved. 题意: 给出$n个数$的乘积,求$这n个数$的最大的可能是GCD 思路: 分解质因子,那么$每个质因子的贡献就是其质因子个数/ n的乘积$ #i ...

  5. 牛客国庆集训派对Day7 Solution

    A    Relic Discovery 水. #include <bits/stdc++.h> using namespace std; int t, n; int main() { s ...

  6. poj2954 Triangle

    地址:http://poj.org/problem?id=2954 题目: Triangle Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  7. 大喜python版opencv3发布,demo脚本抢鲜版发布

    大喜,python版opencv3发布 zwPython3的升级也可以启动了,一直在等这个,zwPython会直接升级到版本3:zwPython3 zwPython3采用64位python3,支持op ...

  8. C# 解析soap数据为json格式

    数据格式: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soa ...

  9. bzoj1628 [Usaco2007 Demo]City skyline(单调栈)

    Description Input 第一行给出N,W 第二行到第N+1行:每行给出二个整数x,y,输入的x严格递增,并且第一个x总是1 Output 输出一个整数,表示城市中最少包含的建筑物数量 Sa ...

  10. Django:表结构发生变化需要执行命令

    Django:表结构发生变化需要执行命令 Django:表结构发生变化需要执行命令 mysite> python manage.py makemigrations blog #让 Django ...