前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >synchronizedMap 和 concurrenthashmap 分别适用于什么场景?

synchronizedMap 和 concurrenthashmap 分别适用于什么场景?

作者头像
葆宁
发布2019-04-18 16:13:30
3.1K0
发布2019-04-18 16:13:30
举报
文章被收录于专栏:FREE SOLOFREE SOLO

如何线程安全的使用HashMap 了解了 HashMap 为什么线程不安全,那现在看看如何线程安全的使用 HashMap。这个无非就是以下三种方式:

Hashtable ConcurrentHashMap Synchronized Map

常用的有Collections工具类的synchronizedMap创建的Map对象,是属于线程安全的;其次就是并发包下的ConcurrentHashMap类。

代码语言:javascript
复制
public synchronized V get(Object key) {
       // 省略实现
}
public synchronized V put(K key, V value) {
    // 省略实现
}

所以当一个线程访问 HashTable 的同步方法时,其他线程如果也要访问同步方法,会被阻塞住。举个例子,当一个线程使用 put 方法时,另一个线程不但不可以使用 put 方法,连 get 方法都不可以.

在这里插入图片描述
在这里插入图片描述

ConcurrentHashMap定位一个元素的过程需要进行两次Hash操作,第一次Hash定位到Segment,第二次Hash定位到元素所在的链表的头部,因此,这一种结构的带来的副作用是Hash的过程要比普通的HashMap要长,但是带来的好处是写操作的时候可以只对元素所在的Segment进行加锁即可,不会影响到其他的Segment,这样,在最理想的情况下,ConcurrentHashMap可以最高同时支持Segment数量大小的写操作(刚好这些写操作都非常平均地分布在所有的Segment上),所以,通过这一种结构,ConcurrentHashMap的并发能力可以大大的提高。

SynchronizedMap的put封装了HashMap的put方法,并加上互斥锁保证了安全性。JDK1.8的ConcurrentHashMap取消了segments字段,采用了transient volatile HashEntry<K,V>[] table保存数据。这样对每个table数组元素加锁,见源代码中synchronized(f),因此可以减少并发冲突的概率,提高并发性能。所以ConcurrentHashMap的put并发性更好,因此相同工作下ConcurrentHashMap花费时间更少。 对于get方法,SynchronizedMap同样封装了HashMap的get方法并且加了同步锁。 ConcurrentHashMap的get方法采用了与HashMap一样的思路,并没有加锁,所以性能上优于SynchrinizedMap的get方法。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年04月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档