关于HashMap和ConcurrentHashMap的初步理解

首先两者都是间接继承了Map,所以都有keyvalue

HashMap是不安全的,ConcurrentHashMap是不安全的。

1、关于HashMap

1HashMap是一个数组链表,基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

2HashMap 实例有两个参数影响其性能初始容量 加载因子容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,通过调用 rehash 方法将容量翻倍

3)HashMap不是同步的如果多个线程同时访问此映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步.

4)基本方法

public V put(K key, V value):在此映射中关联指定值与指定键。如果此映射以前包含了一个该键的映射关系,则旧值被替换。

public V get(Object key):返回指定键在此标识哈希映射中所映射的值,如果对于此键来说,映射不包含任何映射关系,则返回 null。返回值为 null 并不一定 表示对于该键来说,映射不包含任何映射关系,也可能是映射显式地将键映射到 null。使用 containsKey 方法可以区分这两种情况。

5) 不安全性的表现

HashMap在并发环境下使用中最为典型的一个问题,就是在HashMap进行扩容重哈希时导致Entry链形成环。一旦Entry链中有环,势必会导致在同一个桶中进行插入、查询、删除等操作时陷入死循环。

 

2、ConcurrentHashMap

1) 支持检索的完全并发更新的所期望可调整并发的哈希表

·  通过锁分段技术保证并发环境下的写操作

· 通过 HashEntry的不变性Volatile变量的内存可见性和加锁重读机制保证高效、安全的读操作;

·   通过不加锁和加锁两种方案控制跨段操作的的安全性

2) 引入了一个分段锁”的概念,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个HashTable中。在ConcurrentHashMap中,就是Map分成了NSegmentputget的时候,都是现根据key.hashCode()算出放到哪个SegmentSegment 类继承于 ReentrantLock 类,从而使得 Segment 对象能充当锁的角色

3) ConcurrentHashMap允许多个修改()操作并发进行,其关键在于使用了锁分段技术,它使用了不同的锁来控制对哈希表的不同部分进行的修改(),而 ConcurrentHashMap 内部使用段(Segment)来表示这些不同的部分。

4) 不同的是,在HashEntry类中,keyhashnext域都被声明为final的,value域被volatile所修饰,因此HashEntry对象几乎是不可变的,这是ConcurrentHashmap读操作并不需要加锁的一个重要原因。由于value域被volatile修饰,所以其可以确保被读线程读到最新的值,这ConcurrentHashmap读操作并不需要加锁的另一个重要原因。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值