ConCurrentHashMap

jdk1.7 ReentrantLock 分段锁

jdk1.8 CAS+Synchronized

  1. CAS: compare and swap

① CAS如何保证内部的线程安全?你可以把CAS的过程理解为原子操作,在硬件底层保证了其内部指令执行的连续性。jdk内部实现是通过Unsafe类提供的API来实现的,Unsafe类可以 像C语言的指针一样直接操作内存,并且只允许jdk自带的类使用(JUC紧密的使用了Unsafe类)。      

② ConcurrentHashMap 哪里用到了CAS?往往会用CAS来修改一些属性。例如,ConcurrentHashMap采用懒加载的方式,当第一次插入时才会初始化table,如果当前index下为null,此时就会采用CAS的方式去插入(比如多个线程同时监测到当前index下为null,就会都尝试插入)

        2. Synchronized

① Synchronized后续的锁升级策略,使得性能更优

源码

public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>
    implements ConcurrentMap<K,V>, Serializable {
    private static final long serialVersionUID = 7249069246763182397L;

静态成员

  • 节点Node类,注意和HashMap的不同,val和next用volatile修饰
    static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        volatile V val;
        volatile Node<K,V> next;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值