美文网首页
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,这是一种空间换时间的思想。

相关文章

  • JAVA面试必选——HashMap全方位剖析

    HashMap全方位剖析 常见HashMap面试问答 HashMap是不是有序的? 不是有序的。 有没有有序的Ma...

  • HashMap问答

    HashMap是不是线程安全? 不是线程安全的。 为什么不安全? 线程不安全的两个添加是,数据可共享、可修改。Ha...

  • HashMap 源码问答

    问题一:HashMap 初始化分配内存了吗? 问题二:HashMap 什么时候分配的内存?第一次分配了多少? 问题...

  • SparseArray分析

    在写SparseArray某些情况下比HashMap性能更好,按照官方问答的解释,主要是因为SparseArray...

  • SparseArray分析

    在写SparseArray某些情况下比HashMap性能更好,按照官方问答的解释,主要是因为SparseArray...

  • HashMap了解一下

    前言 HashMap HashMap类继承图 HashMap属性 HashMap构造函数HashMap(int i...

  • HashMap源码

    eg: HashMap hashMap = new HashMap<>(); hashMap.put(1,"QG...

  • 2018-03-12

    HashMap in Java HashMap in Redis HashMap in Golang

  • HashMap源码理解

    HashMap理解 HashMap定义 HashMap实现机制 HashMap与HashTable的主要区别 关键...

  • 【16】 hashmap

    hashmap 1.7 和1.8的区别 hashmap全家桶 hashmap 源码解析 hashmap hashm...

网友评论

      本文标题:HashMap问答

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