HashMap问答

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 9,181评论 0 11
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 9,917评论 1 14
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,510评论 11 349
  • 【书籍名称】 《活法》 作者:[日]稻盛和夫 【阅读感受】 1,稻盛和夫先生是世界著名实业家、哲学家、畅销作家,创...
    风之壹把刀阅读 3,349评论 0 1
  • 技巧:可以自动调整大小的打印区域 操作步骤: 1、选取区域 - 页面布局 - 设置打印区域。 2、公式 - 名称管...
    伊丽莎白丽阅读 1,832评论 0 0

友情链接更多精彩内容