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

你可能感兴趣的:(HashMap问答)