HashMap不是线程安全的,因此多线程操作时需要格外小心。

在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从此Map也有安全的了。
ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就变成了HashTable。

从ConcurrentHashMap代码中可以看出,它引入了一个“分段锁”的概念,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个HashTable中。

在ConcurrentHashMap中,就是把Map分成了N个Segment,put和get的时候,都是现根据key.hashCode()算出放到哪个Segment中:




测试程序:

import java.util.concurrent.ConcurrentHashMap;public class ConcurrentHashMapTest {private static ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<Integer, Integer>();public static void main(String[] args) {new Thread("Thread1"){@Overridepublic void run() {map.put(3, 33);}};new Thread("Thread2"){@Overridepublic void run() {map.put(4, 44);}};new Thread("Thread3"){@Overridepublic void run() {map.put(7, 77);}};System.out.println(map);}
}

ConcurrentHashMap中默认是把segments初始化为长度为16的数组。
根据ConcurrentHashMap.segmentFor的算法,3、4对应的Segment都是segments[1],7对应的Segment是segments[12]。

(1)Thread1和Thread2先后进入Segment.put方法时,Thread1会首先获取到锁,可以进入,而Thread2则会阻塞在锁上:

(2)切换到Thread3,也走到Segment.put方法,因为7所存储的Segment和3、4不同,因此,不会阻塞在lock():


以上就是ConcurrentHashMap的工作机制,通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。

(二)Java中的HashMap与ConcurrentHashMap的区别相关推荐

  1. java map套arraylist,在Java中的HashMap和ArrayList的区别?

    In Java, ArrayList and HashMap are used as collections. But I couldn't understand in which situation ...

  2. (三)Java中的HashMap与HashTable的区别

    首先,从JDK源码来看,HashMap和HashTable都实现了Map接口: 可以看出,HashTable是从JDK1.0就有的,HashMap而是从JDK1.2才有的. 二者实现的接口一致. 因此 ...

  3. [转]为什么Java中的HashMap默认加载因子是0.75

    前几天在一个群里看到有人讨论hashmap中的加载因子为什么是默认0.75. HashMap源码中的加载因子 static final float DEFAULT_LOAD_FACTOR = 0.75 ...

  4. java中hashmap_Java HashMap – Java中的HashMap

    java中hashmap Java HashMap is one of the most popular Collection classes in java. Java HashMap is Has ...

  5. linux hashmap,Java中对HashMap的深度分析与比较

    Java中对HashMap的深度分析与比较 在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能的关键.由于本人接触了一个有关性能与逻辑同时并存的问题,于是就开始研究这方面的问 ...

  6. 使用List在Java中的HashMap实现

    HashMap is one of the most widely used implementation of Map to store key-value pairs. It was introd ...

  7. 关于Java中的HashMap的深浅拷贝的测试与几点思考

    0.前言 工作忙起来后,许久不看算法,竟然DFA敏感词算法都要看好一阵才能理解...真是和三阶魔方还原手法一样,田园将芜,非常可惜啊. 在DFA算法中,第一步是需要理解它的数据结构,在此基础上,涉及到 ...

  8. Java 中的 HashMap

    Java 中的 HashMap 作者:Grey 原文地址:Java 中的 HashMap 扩容机制 jdk1.7 先生成新数组. 遍历老数组中的每个位置上的链表上的个元素. 取个元素的key,并基于新 ...

  9. java foreach hashmap_在 Java 中遍历 HashMap 的5种最佳方式

    在本文中,我们将通过示例讨论在 Java 上遍历  HashMap  的五种最佳方式. 使用  Iterator  遍历 HashMap EntrySet 使用  Iterator  遍历 HashM ...

最新文章

  1. Pandas中DataFrame和array相互转化(DataFrame数据直接水平合并)
  2. linux64命令,每天一个Linux命令(64)shutdown命令
  3. java中有ClockPane类吗,JavaFX实现简易时钟效果(二)
  4. OS_CORE.C(总结)
  5. linux服务器内存、根目录使用率、某进程的监控告警脚本
  6. 模拟器显示空白图片_Kawaks街机模拟器,还是小时候的味道!
  7. SQL工作笔记-达梦7存储过程中游标的使用(for循环 IF等)
  8. Linux 创建快捷方式
  9. 上汽集团:R汽车改名飞凡汽车
  10. 中国喷漆室保护膜市场趋势报告、技术动态创新及市场预测
  11. IOS UIColor 自定义颜色
  12. python实现xml数据解析处理
  13. ios系统gps测试软件,GPS工具箱苹果版
  14. GPU硬件加速原理 /转
  15. PPT制作手机手指滑动效果
  16. 6月刊精彩文章推荐:圆桌共话数据库
  17. Fandis COSTECH A17M23SWB MT0 AC220V 50HZ 42W
  18. matlab 打开xls文件,matlab中读取excel的xls文件
  19. android 在线预览pdf文件
  20. 最强损失函数分析:一般自适应鲁棒损失函数

热门文章

  1. C# 类型参数的约束
  2. LeetCode OJ - Best Time to Buy and Sell Stock III
  3. Spider局域网通讯软件
  4. python django+bootstrap4+mysql智慧交通系统构建
  5. 小程序中曾经遇到的坑(1)----canvas画布
  6. combobox的值从主页面传递到子页面
  7. Java语法基础,课后实践
  8. Foxconn Core Concept
  9. PHP 异常处理 throw new exception
  10. express捕获全局异常的三种方法