ConcurrentHashMap常问问题

作者&投稿:藤衬 (若有异议请与网页底部的电邮联系)
~ 采用了分段锁的思想,将哈希桶数组分成一个个的Segment数组(继承ReentrantLock),每一个Segment里面又有多个HashEntry,也是被volatile修饰的,是为了保证在数组扩容时候的可见性,HashEntry中又有key,hash,value,next属性,而value,next又是被volatile修饰为了保证多线程环境下数据修改时的可见性,多线程环境下ConcurrentHashMap会对这些小的数组进行加锁,这样多线程操作Map就相当于是操作单线程环境下的HashMap,比如A线程对其中一个段进行写操作的时候线程B就不能对其进行写操作,但是线程B可以对其他的段进行写操作,从而实现并发修改和访问。

JDK1.8的ConcurrentHashMap摒弃了分段锁的思想,采用jdk1.8中HashMap的底层机构,Node数组+链表+红黑树。Node是继承了Entry的一个内部类,他的value和next都是被volatile修饰的原因也是为了保证多线程下修改数据的可见性。

采用CAS+synchronized实现更加细粒度的锁,将锁的级别控制在更细粒度的哈希桶数组元素的级别,只需要锁住链表头节点(红黑树的根节点)就不会影响到其他哈希桶数组元素的读写,大大的提高了并发度。

是不需要加锁的,因为Node节点使用了volatile修饰了value和next节点,而在jdk8中同样也是使用了volatile修饰了value和next节点,这样保证可见性了就不需要加锁了。

key不能为空,无法解释,没有什么可说的,可能就是作者的想法。
value不能为空是因为ConcurrentHashMap是工作在多线程环境下的,如果调用get方法,返回null,这个时候就存在二义性,因为ConcurrentHashMap不知道是没有这个key,还是这个key对应的值是不是null。所以干脆不支持value为null。

HashMap的迭代器是强一致性的,而ConcurrentHashMap的迭代器是弱一致性的,因为在多线程环境下,在创建迭代器的过程中,内部的元素会发生变化,如果是在已经遍历过去的数据中发生变化,迭代器是无法反映出来数据发生了改变,如果是发生在未迭代的数据时,这个时候就会反映出来,强一致性就是说只要迭代器创建出来之后数据就不会发生改变了。这样设计的好处就是迭代器线程可以使用原来的老数据进行遍历,写线程可以并发的完成改变,这样就保证了多个线程执行的时候的连续性和可拓展性,提升了并发性能。

JDK1.7中,并发度就是ConcurrentHashMap中的分段个数,即Segment[]数组的长度,默认是16,这个值可以在构造函数中设置。如果自己设置了并发度那么就会和HasHMap一样会去找到大于等于当前输入值的最小的2的幂指数作为实际并发度。如果过小就会产生锁竞争,如果过大,那么就会导致本来位于同一个Segment的的访问会扩散到不同的Segment中,导致性能下降。
JDK1.8中摈弃了Segment的概念,选择使用HashMap的结构,并发度依赖于数组的大小。

ConcurrentHashMap效率高,因为hashTable是给整个hash表加锁,而ConcurrentHashMap锁粒度要更低。

使用Collections.synchronizedMap(Map类型的对象)方法进行同步加锁,把对象转换为SynchronizedMap<K,V>类型。其实就是对HashMap做了一次封装,多个线程竞争一个mutex对象锁,在竞争激烈的情况下性能也非常差,不推荐使用。


什么是Oncurrent 事件
是Access 2007编程的时候用的,下面有具体应用方法的实例:OnCurrent 属性 适用于: Microsoft Office Access 2007 适用于 Form 对象 设置或返回窗体的“属性”窗口中“成为当前”框的值。可读\/写 String 类型。expression.OnCurrent expression 必选。一个表达式,返回“适用于”列表中的某个对象。注解 此...

current, present, recent在表示形容词性的时候,有哪些区别?
current,present,recent在表示形容词性的时候发生的时间不同、词性不同、在句型中用法不同。一、表示形容词性的时候,表示发生的时间不同 1、current指目前存在和发生的。2、recent表示新近的,最近的,时间的长短依据所修饰的人或物而定。3、present是这些词中语气最强的一个。指现在正发生、起作用...

current基本词义
例如,句子"This button switches the current on"表明电钮可以控制电流的通断;"The current is strongest in the middle of the river"则说明河流中心水流最急。另一方面,"This word is no longer in current use"提醒我们某个词汇已不再流行或使用。

current是什么意思啊(current什么意思)
我们划船逆流而上。2.Thecanoefoundthecurrentandswungaround.独木舟遇上了急流,打着转。3.Whatisthecurrentthinkingonthisquestion?目前对这个问题的看法是什么?电源上的current做什么用 电源上的current是电流的意思,用来提供设备或电路所需要的电流。具体来说,电流是通过电源输出的,它提供设备和电路所需...

词汇精选:current的用法和辨析
, n. , (水,气,电)流 [U,C] , 例句: ,Hot and cold air currents power the weather systems on earth.,冷热气流是地球上天气系统的最主要的组成部分。, 例句: ,He is swimming against the strong current.,他正在逆着湍流游泳。, 趋势,潮流 [C] , 例句: ,...

current怎么读
current的读音是:英['k_r_nt]。current的读音是:英['k_r_nt]。current的详尽释义是n.(名词)潮流(水、气、电)流趋势,趋向流动思潮,风潮《潮流》月刊。current【近义词】modern。一、详尽释义点此查看current的详细内容n.(名词)潮流(水、气、电)流趋势,趋向流动思潮,风潮《潮流》月刊adj....

什么是Current
Current的中文意思是趋势。Current 一、读音 英 ['kʌrənt]     美 ['kɜːrənt]二、含义 n. 趋势;(水、气、电)流 adj. 现在的;流通的 三、例证 The block becomes magnetic when the current is switched on.通电时线圈即具磁性。四、词汇搭配 1、...

current,present,recent三个词有什么区别
current、present、recent三个词的区别:意思不同、用法不同、侧重点不同 一、意思不同 1.current意思:adj. 现在的;流通的 2.present意思:adj. 现在的;当前的;存在的 3.recent意思:adj. 近来的;新近的;现在的 二、用法不同 1.current用法:作形容词表示“最近的”,无需用very等程度副词...

什么是Current
current可以表示为函数的符号,也可以表示为英语单词。或者可以理解为计算机操作命令。 current() 函数返回数组中的当前元素(单元)。 每个数组中都有一个内部的指针指向它“当前的”元素,初始指向插入到数组中的第一个元素。 current() 函数返回当前被内部指针指向的数组元素的值,并不移动指针。如果内部...

balance of payment on current account的数是负数表示什么
表示银行的 current account 也就支票帐户的balance of payment 借方余额透支,可能要再深入看支票帐户的balance of receivable才能确定真正余额如何 ;

榆林市19569648800: JAVA中线程安全的map有哪些? -
从卿安络: JAVA中线程安全的map有:Hashtable、synchronizedMap、ConcurrentHashMap.java中map中线程安全怎么实现:1. 同步的map就是Hashtable, concurrenthashmap.2. 你看到的Hashtable就是直接在hashmap上加了个锁,concurrenthashmap...

榆林市19569648800: concurrenthashmap和hashmap的区别 -
从卿安络: 类 HASHSET 所有已实现的接口:Serializable, Cloneable, Iterable, Collection, Set 此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持.它不保证 set 的迭代顺序;特别是它不保证该顺序搜索恒久不变.此类允许使用 null 元素. ...

榆林市19569648800: 如何在java中使用ConcurrentHashMap -
从卿安络: 参考如下内容:ConcurrentHashMap锁的方式是稍微细粒度的. ConcurrentHashMap将hash表分为16个桶(默认值),诸如get,put,remove等常用操作只锁当前需要用到的桶.试想,原来 只能一个线程进入,现在却能同时16个写线程进入(写...

榆林市19569648800: java 如何遍历concurrenthashmap -
从卿安络: 和遍历HashMap是一样的,有多种方法,给出计算较少的一种 ConcurrentHashMap<K,V> map=....数据 for(Map.Entry<K,V> e: map.entrySet() ){System.out.println("键:"+e.getKey()+", 值:"+e.getValue()); }

榆林市19569648800: ConurrentHashMap和Hashtable的区别 -
从卿安络: Hashtable和ConcurrentHashMap有什么分别呢?它们都可以用于多线程的环境,但是当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间.因为ConcurrentHashMap引入了分割(segmentation),不论它变得多么大,仅仅需要锁定map的某个部分,而其它的线程不需要等到迭代完成才能访问map.简而言之,在迭代的过程中,ConcurrentHashMap仅仅锁定map的某个部分,而Hashtable则会锁定整个map.

榆林市19569648800: ConcurrentHashMap 弱一致的迭代器 是什么原理 -
从卿安络: concurrenthashmap是弱一致的,iterator 都是弱一致性的,两者的迭代器的一致性不同的

榆林市19569648800: concurrenthashmap是怎么实现线程安全的 -
从卿安络: 在ConcurrentHashMap没有出现以前,jdk使用hashtable来实现线程安全,但是hashtable是将整个hash表锁住,所以效率很低下.ConcurrentHashMap将数据分别放到多个Segment中,默认16个,每一个Segment中又包含了多个HashEntry列表...

榆林市19569648800: hashmap和concurrenthashmap的区别,hashmap的底层源码 -
从卿安络: 你好. 有并发访问的时候用ConcurrentHashMap,效率比用锁的HashMap好 功能上可以,但是毕竟ConcurrentHashMap这种数据结构要复杂些,如果能保证只在单一线程下读写,不会发生并发的读写,那么就可以试用HashMap.ConcurrentHashMap读不加锁,写...

榆林市19569648800: ConcurrentMap和HashMap的区别 -
从卿安络: 类 HASHMAP<K,V> 所有已实现的接口:Serializable, Cloneable, Map<K,V> 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相...

榆林市19569648800: HashMap HashTable和ConcurrentHashMap的区别 -
从卿安络: java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap. Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复. Hashmap 是一...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网