原文网址:Java之HashMap系列--保证线程安全的方法_IT利刃出鞘的博客-CSDN博客
简介
本文介绍Java中的HashMap如何进行线程安全的操作、为什么HashMap不是线程安全的。
这几个问题也是Java后端面试中经常问到的问题。
HashMap线程安全的操作方法
线程安全Map的三种方法
方法 | 示例 | 原理 | 性能 |
HashTable | Map<String, Object> map = new Hashtable<>(); | synchronized修饰get/put方法。 方法级阻塞,只能同时一个线程操作get或put | 很差。 |
Collections.synchronizedMap | Map<String, Object> map = Collections.synchronizedMap( new HashMap<String, Object>()); | 所有方法都使用synchronized修饰。 | 很差。 和HashTable差不多。 |
JUC中的ConcurrentHashMap | Map<String, Object> map = new ConcurrentHashMap<>(); | 每次只给一个桶(数组项)加锁。 | 很好。 |
HashTable线程安全的原理
所有方法都用了synchronized修饰
public synchronized V get(Object key) {
// ...
}
public synchronized V put(K key, V value) {
// ...
}
public synchronized int size() {
return count;
}
Collections.synchronizedMap线程安全的原理
此方法返回的是:Collections的静态内部类SynchronizedMap
内部有个mutex对象,对它加锁。
final Object mutex;
public V get(Object key) {
synchronized (mutex) {return m.get(key);}
}
public V put(K key, V value) {
synchronized (mutex) {return m.put(key, value);}
}
public int size() {
synchronized (mutex) {return m.size();}
}
HashMap为什么线程不安全
上边是文章的部分内容,为便于维护,全文已迁移到此网址:Java-HashMap保证线程安全的方法 - 自学精灵