美文网首页
HashMap问答

HashMap问答

作者: 李昂的数字之旅 | 来源:发表于2018-07-26 00:51 被阅读0次

    HashMap是不是线程安全?

    不是线程安全的。

    为什么不安全?

    线程不安全的两个添加是,数据可共享、可修改。HashMap底层是用Node[]数组来存储元素,满足可共享和可修改,所以在多线程一起更新时,会得到不可预期的结果。

    有什么安全的实现方式?

    在以前可以用HashTable来代替,它的put、remove等对方法都加了锁,在多线程下是安全的。但是锁加在方法上,力度太大,导致性能不理想。所以在JDK1.5后引入了并发包,里面的ConcurrentHashMap解决了HashMap线程安全问题和Hashtable的性能问题。

    为什么ConcurrentHashMap是线程安全的?

    ConcurrentHashMap通过加锁来互斥多线程的修改操作,但是它锁力度是每个桶,会拿每个桶的第一个元素作为锁对象,对一个桶进行加锁。多个桶之间的修改是相互独立的。另外在很多地方用了CAS操作,来避免加锁。CAS是通过直接调用CPU的指令来更新数据,是一个原子性操作,比加锁开销要小。但它是建立在低竞态的前提下。

    ConcurrentHashMap可以替代HashMap吗?

    这要根据不同的场景去分析。如果是在多线程环境下可能会发生线程不安全的问题,可以用ConcurrentHashMap替代HashMap;但没有线程安全问题时,用HashMap性能更好。这跟StringBuilder和StringBuffer一样。当然也可以通过ThreadLocal+HashMap来替代ConcurrentHashMap,这是一种空间换时间的思想。

    相关文章

      网友评论

          本文标题:HashMap问答

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