美文网首页
ConcurrentHashMap & Hashtable

ConcurrentHashMap & Hashtable

作者: 小小弓长张 | 来源:发表于2020-03-25 15:49 被阅读0次

    HashMap中的链表大小超过八个的时候会自动转化为红黑树,当删除小于六的时候重新变为链表。

    HashMap在多线程的情况下存在线程安全问题,怎么去解决?

    答:在多线程的情境下可以使用

    1. Collection.synchronizedMap(Map)创建线程安全的Map集合;

    2. HashTable

    3. ConcurrentHashMap

    出于线程并发度的原因ConcurrentHashMap他的性能和效率都明显高于前两个。

    Collection.synchronizedMap怎么实现线程安全?

    答:synchronizedMap内部维护了一个普通对象Map,还有排斥锁mutex

    Collections.synchronizedMap(new HashMap<>(16));

    在调用这个方法的时候就需要传入一个Map,可以看见有两个构造器,如果传入了mutex参数,则将对象排斥锁赋值为传入的对象。

    如果没有,则将对象排斥锁赋值为this,即调用synchronizedMap对象。

    创建出synchronizedMap对象之后,在操作Map时,就会对方法上锁。

    请说明HashTable和HashMap的区别?

    答:HashTable是线程安全的,适合在多线程的情况下使用,但是效率低。HashTable在对数据操作的时候都会上锁(方法上有synchronized关键字),所以效率低。

    HashMap线程不安全。

    HashTable中的key和value 都不可以为null。HashMap中key和value可以为null。

    实现方式不同:HashTable继承了Dictionary类,而HashMap继承的时AbstractMap类。

    初始化容量不同:HashMap的初始容量为16,HashTable的初始容量为11.两者的负载因子都是0.75.

    扩容机制不同:当现有容量大于总容量*负载因子时,HashMap扩容规则为当前容量翻倍。HashTable扩容规则为当前容量翻倍+1.

    为什么HashTable不允许key和value为null?

    答:HashTable在put空值的时候会直接抛出空指针异常。HashTable使用的是安全失败

    机制(fail-safe),这种 机制会使你此次读到的数据不一定是最新的数据。如果put Null值就会使其无法判断对应的key是不存在还是为空。因为你无法在调用一次contain(Key)来对key是否存在进行判断。

    ConcurrentHashMap数据结构,为什么在多线程的情况下是线程安全的?

    答:ConcurrentHashMap底层是基于数组+链表的结构组成的。是由Segment数组,HashEntry组成和HashMap一样。不同的地方在于他用volatile去修饰他的数据value还有下一个节点next。

    volatile的特性是什么?

    答:1:禁止指令重排序。

    2:保证不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这个新值对其他线程来说是立即可见的。

    3:volatile只能保证对单次读写的原子性。

    相关文章

      网友评论

          本文标题:ConcurrentHashMap & Hashtable

          本文链接:https://www.haomeiwen.com/subject/dwmwyhtx.html