zoukankan      html  css  js  c++  java
  • ConcurrentHashMap & Hashtable

    https://juejin.im/post/5df8d7346fb9a015ff64eaf9

    HashMap在多线程环境下存在线程安全问题怎么解决

    • 使用Collections.synchronizedMap(Map)创建线程安全的map集合;
    • Hashtable
    • ConcurrentHashMap

    Hashtable:

    跟HashMap相比Hashtable是线程安全的,适合在多线程的情况下使用,但是效率可不太乐观。

    他在对数据操作的时候都会上锁,所以效率比较低下。

     Hashtable 跟HashMap不同之处:

    Hashtable 是不允许键或值为 null 的,HashMap 的键值则都可以为 null

    因为Hashtable在我们put 空值的时候会直接抛空指针异常,但是HashMap却做了特殊处理。

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

    Hashtable使用的是安全失败机制(fail-safe),这种机制会使你此次读到的数据不一定是最新的数据。

    如果你使用null值,就会使得其无法判断对应的key是不存在还是为空,因为你无法再调用一次contain(key)来对key是否存在进行判断,ConcurrentHashMap同理。

    •  实现方式不同:Hashtable 继承了 Dictionary类,而 HashMap 继承的是 AbstractMap 类。

      Dictionary 是 JDK 1.0 添加的,貌似没人用过这个,我也没用过。

    • 初始化容量不同:HashMap 的初始容量为:16,Hashtable 初始容量为:11,两者的负载因子默认都是:0.75。

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

    • 迭代器不同:HashMap 中的 Iterator 迭代器是 fail-fast 的,而 Hashtable 的 Enumerator 不是 fail-fast 的。

      所以,当其他线程改变了HashMap 的结构,如:增加、删除元素,将会抛出ConcurrentModificationException 异常,而 Hashtable 则不会。

    快速失败(fail—fast)是java集合中的一种机制, 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。

    迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。

    集合在被遍历期间如果内容发生变化,就会改变modCount的值。

    每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。

     
     
     
     
     
    • 谈谈你理解的 Hashtable,讲讲其中的 get put 过程。ConcurrentHashMap同问。
    • 1.8 做了什么优化?
    • 线程安全怎么做的?
    • 不安全会导致哪些问题?
    • 如何解决?有没有线程安全的并发容器?
    • ConcurrentHashMap 是如何实现的?
    • ConcurrentHashMap并发度为啥好这么多?
    • 1.7、1.8 实现有何不同?为什么这么做?
    • CAS是啥?
    • ABA是啥?场景有哪些,怎么解决?
    • synchronized底层原理是啥?
    • synchronized锁升级策略
    • 快速失败(fail—fast)是啥,应用场景有哪些?安全失败(fail—safe)同问。
    • ……
  • 相关阅读:
    ORACLE游标概念讲解
    [转载]Oracle如何查看日志
    oracle 游标以及游标变量
    Oracle游标大全
    [转载]Oracle如何查看日志
    追踪从指缝溜走的时间
    《Falcon 初印象》幻灯分享
    百姓网那道题
    一个JavaScript写的黑白棋AI
    trac 推广 ppt 分享
  • 原文地址:https://www.cnblogs.com/lingcheng7777/p/12069761.html
Copyright © 2011-2022 走看看