Java ConcurrentHashMap

通过分析Hashtable就知道,synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,

ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。

ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。
有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。这里“按顺序”是很重要的,否则极有可能出现死锁,

在ConcurrentHashMap内部,段数组是final的,并且其成员变量实际上也是final的,但是,仅仅是将数组声明为final的并不保证数组成员也是final的,这需要实现上的保证。这可以确保不会出现死锁,因为获得锁的顺序是固定的。

ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁,可以简单理解成把一个大的HashTable分解成多个,形成了锁分离。

ConcurrentHashMap中主要实体类就是三个:ConcurrentHashMap(整个Hash表),Segment(桶),HashEntry(节点)

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

时间: 2024-12-20 12:15:51

Java ConcurrentHashMap的相关文章

Java ConcurrentHashMap Example and Iterator--转

原文地址:http://www.journaldev.com/122/java-concurrenthashmap-example-iterator#comment-27448 Today we will look into Java ConcurrentHashMap Example. If you are a Java Developer, I am sure that you must be aware of ConcurrentModificationException that com

Java ConcurrentHashMap存入引用对象时也是线程安全的

本人小白,看到资料说ConcurrentHashMap是线程安全的,get过程不需要加锁,put是线程安全的,推荐高并发时使用.但是本人不清楚是否该map中存入的引用类型对象,对象属性变化也是否线程安全的,看了很多资料,貌似都没说明这一点,所以写代码测试一下, package testConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap; /** * Created by xuzimian on 17-3-1. */ p

Java ConcurrentHashMap学习 —— HashMap Vs. ConcurrentHashMap Vs. SynchronizedMap – How a HashMap can be Synchronized in Java

HashMap is a very powerful data structure in Java. We use it everyday and almost in all applications. There are quite a few examples which I have written before on How to Implement Threadsafe cache, How to convert Hashmap to Arraylist? We used Hashma

Java ConcurrentHashMap工作原理及实现

参考文章: ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) https://youzhixueyuan.com/concurrenthashmap.html 漫画:什么是ConcurrentHashMap(JDK1.7)? https://zhuanlan.zhihu.com/p/31614308 ConcurrentHashMap 原理解析(JDK1.8) https://www.jianshu.com/p/d10256f0ebea 探索 ConcurrentHas

java ConcurrentHashMap 初识

“ConcurrentHashMap是一个线程安全的哈希表“,但是不允许key和value为空: HashTable和ConcurrentHashMap都是线程安全的,但是HashTable是同步容器,ConcurrentHashMap是并发容器,采用了锁分离策略,在并发环境中,应多使 用ConcurrentHashMap,它具有非常好的并发性能,可以多个线程同时读写.而HashTable只能同时一个线程读写. 可以简单的把ConcurrentHashMap理解为多个HashMap组合,锁不是在

Java ConcurrentHashMap 的理解

HashMap是不安全的类,Java5.0前是使用了同步锁将HashMap给封装起来,但有个缺点,这样将把所有的访问都串行化,这样会严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重降低. ConcurrentHashMap并不是将每个方法都在同一个锁上同步,而是使用一种粒度更细的加锁进制来实现更大程度的共享,这种机制称为分段锁. 从Concurrent的源码中可以看出,读取操作是没有加锁的. 接下来看Map中node的值,可以从下图源码中看出有四个值, hash,key, val, nex

Java ConcurrentHashMap分析

ConcurrentHashMap就是HashMap的线程安全版本,值得一提的是,ConcurrentHashMap并没有用一个锁来保护整个哈希区,而是使用了16个锁,将哈希区分成了16个桶,每一个锁控制一个桶,即锁分段,这样子可以更加细粒度的锁对象,所以最大提供16个并发的读写,来提高吞吐量. 但是这种技术也带来了不好的地方,比如有些方法需要扫描这个哈希区,如size()方法或者是containsValue()方法,这样子将使用多个锁而不是一个锁来实现,而当需要多把锁的时候,就需要某些技术,如

Java之ConcurrentHashMap的演进

1. 线程不安全的HashMap 本节的代码均基于JDK 1.7.0_67 HashMap是非线程安全的,HashMap的线程不安全主要体现在resize时的死循环及使用迭代器时的fast-fail上. 1.1 HashMap工作原理 1.1.1 HashMap寻址方式 对于新插入的数据或者待读取的数据,HashMap将Key的哈希值对数组长度取模,结果作为该Entry在数组中的index.取模的代价远高于位操作的代价,因此HashMap要求数组的长度必须为2的N次方.此时将Key的哈希值对2^

Java并发指南13:Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析 转自https://www.javadoop.com/post/hashmap#toc7 部分内容转自 http://www.jasongj.com/java/concurrenthashmap 今天发一篇"水文",可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍.本来以为花不了多少时间的,不过最终还是投入了挺多时间来完成这篇文章的. 网上关于 HashMap 和 Con