首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

并发容器之ConcurrentHashMap(1)

SynchronizedMap

HashMap不是线程安全的,即在并发场景下,多个线程共享一个HashMap对象,将会出现程序紊乱。在并发场景下如果要保证一种可行的方式是使用 Collections.synchronizedMap() 方法来包装我们的 HashMap。

/**

* Collections.synchronizedMap()源码,返回一个SynchronizedMap对象

*/

publicstaticMapsynchronizedMap(Map m){

returnnewSynchronizedMap(m);

}

/**

* SynchronizedMap源码

*/

privatestaticclassSynchronizedMap

implementsMap,Serializable{

privatestaticfinallongserialVersionUID =1978198479659022715L;

/**

* SynchronizedMap内部依靠Map实现常见的K-V操作。

*/

privatefinalMap m;// Backing Map

/**

* 锁对象,用于控制SynchronizedMap内部的Map对象m的线程安全。

*/

finalObject mutex;// Object on which to synchronize

SynchronizedMap(Map m) {

this.m = Objects.requireNonNull(m);

mutex =this;

}

SynchronizedMap(Map m, Object mutex) {

this.m = m;

this.mutex = mutex;

}

publicintsize(){

synchronized(mutex) {returnm.size();}

}

publicbooleanisEmpty(){

synchronized(mutex) {returnm.isEmpty();}

}

······

SynchronizedMap示意图

Hashtable

与SynchronizedMap类似,Hashtable也是通过synchronized实现线程安全的,不同的是,Hashtable并没有借助内部的属性作为锁对象,而是在每个方法上加上了synchronized关键字,即Hashtable使用的锁对象是Hashtable对象本身。

publicclassHashtable

extendsDictionary

implementsMap,Cloneable,java.io.Serializable{

/**

* The hash table data.

*/

privatetransient Entry[] table;

/**

* The total number of entries in the hash table.

*/

privatetransient int count;

/**

* The table is rehashed when its size exceeds this threshold. (The

* value of this field is (int)(capacity * loadFactor).)

*

*@serial

*/

privateint threshold;

/**

* Returns the number of keys in this hashtable.

*

*@returnthe number of keys in this hashtable.

*/

publicsynchronized int size() {

returncount;

}

/**

* Tests if this hashtable maps no keys to values.

*

*@returntrue if this hashtable maps no keys to values;

* false otherwise.

*/

publicsynchronized boolean isEmpty() {

returncount ==;

}

······

ConcurrentHashMap

SynchronizedMap和Hashtable都是通过使用一个全局的锁来同步不同线程间的并发访问,因此会带来不可忽视的性能问题——锁的粒度是方法级的,因此同一个方法无法在多线程环境下并发执行。于是就有了 HashMap 的线程安全版本—— ConcurrentHashMap 的诞生。在 ConcurrentHashMap 中,无论是读操作还是写操作都能保证很高的性能:在进行读操作时(几乎)不需要加锁,而在写操作时,JDK1.7和JDK1.8分别使用了不同的方式实现了线程安全。

JDK 1.7 ConcurrentHashMap

JDK 1.8 ConcurrentHashMap

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210307A0AR9S00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券