标签:
ConcurrentHashMap是线程安全的HashMap的实现。
put(Object key, Object value):
ConcurrentHashMap并没有在此方法上加上synchronized,首先判断value是否为null,如为null,则抛出NullPointerException,如不为null,则继续下面的步骤:
和HashMap一样,首先对key.hashCode进行hash操作,得到key的hash值。Hash操作的算法和HashMap也不同。
根据此hash值计算并获取其对应的数组中的Segment对象。
在找到了数组中的Segment对象后,接着调用Segment对象的put方法来完成当前操作。
当调用Segment对象的put方法时,首先进行lock操作,接着判断当前存储的对象个数加1后是否大于threshold。如果大于,则将当前的HashEntry对象数组大小扩大两倍,并将之前存储的对象重新hash,转移到新的对象数组中。
ConcurrentHashMap基于concurrencyLevel划分出了多个Segment来对key-value进行存储,从而避免每次put操作都得锁住整个数组。在默认的情况下,最佳情况下,可以允许16个线程并发无阻塞的操作集合对象,尽可能地减少并发时的阻塞现象。
Remove(Object key):
首先对key.hashCode进行hash操作,基于得到hash的值找到对应的Segment对象,调用其remove方法完成当前操作。
Segment的remove方法进行加锁操作,操作完后,会释放锁。
ConcurrentHashMap默认情况下,采用将数据分为16个段进行存储,并且16个段分别持有各自的锁,锁仅用于put和remove等改变集合对象的操作,读取数据不加锁。
标签:
原文地址:http://www.cnblogs.com/chy2055/p/5207842.html