(二)Java中的HashMap与ConcurrentHashMap的区别
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的区别相关推荐
- java map套arraylist,在Java中的HashMap和ArrayList的区别?
In Java, ArrayList and HashMap are used as collections. But I couldn't understand in which situation ...
- (三)Java中的HashMap与HashTable的区别
首先,从JDK源码来看,HashMap和HashTable都实现了Map接口: 可以看出,HashTable是从JDK1.0就有的,HashMap而是从JDK1.2才有的. 二者实现的接口一致. 因此 ...
- [转]为什么Java中的HashMap默认加载因子是0.75
前几天在一个群里看到有人讨论hashmap中的加载因子为什么是默认0.75. HashMap源码中的加载因子 static final float DEFAULT_LOAD_FACTOR = 0.75 ...
- java中hashmap_Java HashMap – Java中的HashMap
java中hashmap Java HashMap is one of the most popular Collection classes in java. Java HashMap is Has ...
- linux hashmap,Java中对HashMap的深度分析与比较
Java中对HashMap的深度分析与比较 在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能的关键.由于本人接触了一个有关性能与逻辑同时并存的问题,于是就开始研究这方面的问 ...
- 使用List在Java中的HashMap实现
HashMap is one of the most widely used implementation of Map to store key-value pairs. It was introd ...
- 关于Java中的HashMap的深浅拷贝的测试与几点思考
0.前言 工作忙起来后,许久不看算法,竟然DFA敏感词算法都要看好一阵才能理解...真是和三阶魔方还原手法一样,田园将芜,非常可惜啊. 在DFA算法中,第一步是需要理解它的数据结构,在此基础上,涉及到 ...
- Java 中的 HashMap
Java 中的 HashMap 作者:Grey 原文地址:Java 中的 HashMap 扩容机制 jdk1.7 先生成新数组. 遍历老数组中的每个位置上的链表上的个元素. 取个元素的key,并基于新 ...
- java foreach hashmap_在 Java 中遍历 HashMap 的5种最佳方式
在本文中,我们将通过示例讨论在 Java 上遍历 HashMap 的五种最佳方式. 使用 Iterator 遍历 HashMap EntrySet 使用 Iterator 遍历 HashM ...
最新文章
- Pandas中DataFrame和array相互转化(DataFrame数据直接水平合并)
- linux64命令,每天一个Linux命令(64)shutdown命令
- java中有ClockPane类吗,JavaFX实现简易时钟效果(二)
- OS_CORE.C(总结)
- linux服务器内存、根目录使用率、某进程的监控告警脚本
- 模拟器显示空白图片_Kawaks街机模拟器,还是小时候的味道!
- SQL工作笔记-达梦7存储过程中游标的使用(for循环 IF等)
- Linux 创建快捷方式
- 上汽集团:R汽车改名飞凡汽车
- 中国喷漆室保护膜市场趋势报告、技术动态创新及市场预测
- IOS UIColor 自定义颜色
- python实现xml数据解析处理
- ios系统gps测试软件,GPS工具箱苹果版
- GPU硬件加速原理 /转
- PPT制作手机手指滑动效果
- 6月刊精彩文章推荐:圆桌共话数据库
- Fandis COSTECH A17M23SWB MT0 AC220V 50HZ 42W
- matlab 打开xls文件,matlab中读取excel的xls文件
- android 在线预览pdf文件
- 最强损失函数分析:一般自适应鲁棒损失函数