HashMap,Hashtabel,ConcurrentHashMap的区别

这三者的关系面试最常被问到的,在这里说下自己的理解。
首先HashMap是线程不安全的,在处理高并发的情况下不适用,Hatabel和Concurrent作为线程安全的集合类,就派上用场了。那这两者是怎么实现线程安全,以及两者的区别在哪呢?
首先我么来看一下Hashtabel的源码:

public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
    throw new NullPointerException();
}
 // Makes sure the key is not already in the hashtable.
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
@SuppressWarnings("unchecked")
Entry<K,V> entry = (Entry<K,V>)tab[index];
for(; entry != null ; entry = entry.next) {
    if ((entry.hash == hash) && entry.key.equals(key)) {
        V old = entry.value;
        entry.value = value;
        return old;
    }
}
 addEntry(hash, key, value, index);
return null;
}
public synchronized V get(Object key) {
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
    if ((e.hash == hash) && e.key.equals(key)) {
        return (V)e.value;
    }
}
return null;
}

通过synchronize锁来实现线程安全的,这样就不会出现两个线程同时对数据进行操作,降低了执行的效率。
而ConcurrentHashMap则使用CAS算法,在读不加锁,写操作给每个segment加锁,其他的segment还可以被其他的线程操作,提高了并发的执行效率。java1.7之前实现方法:
分段锁
在这里插入图片描述
将内部进行分段,即segment,每个segment下HashEntry数组,和HashMap类似,加锁的时候在segment,不影响其他的segment,让锁的粒度变小

补充
ConcurrentHashMap主要是一个大的HashEntry数组和多个segment组成,通过两次hash算法,把数据存到segment的链表中。
segment继承RetrantLock,在进行put操作时,进行tryLock()获取锁,如果获取成功就插入到位置,如果获取失败,自旋循环获取,超过指定次数挂起,等待唤醒

jdk1.8是利用CAS+Synchronized来保证并发更新的安全,底层采用数组+链表+红黑树的存储结构

补充
Synchronize和RetrantLock的区别:
1 早期的时候,Synchronize是基于JVM的,调用操作的接口时间消耗较长
2 RetrantLock则是程序员手写的,通过lock()和unlock()方法配合try/finally语句块来完成。可以设置过期时间,避免死锁,而且设置了中断机制
3 java1.8后,synchronize有了很大的优化,性能和RetrantLock差不多

java中的锁有哪些??
可参考https://www.cnblogs.com/hustzzl/p/9343797.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值