面试题答案
一键面试可能出现的问题
- 数据一致性问题:在高并发读写时,普通的
HashMap
不是线程安全的,可能导致数据覆盖、丢失更新等情况。例如多个线程同时写入不同键值对,可能发生哈希冲突处理不当,导致数据错乱。 - 性能问题:传统
HashMap
在高并发写时可能会频繁扩容,导致性能下降。而且在多线程读取时,由于没有同步机制,可能读到脏数据。
基于ConcurrentHashMap的优化思路
- 利用ConcurrentHashMap的线程安全特性:
ConcurrentHashMap
内部采用分段锁机制(JDK 1.8后采用CAS和synchronized优化),允许多个线程同时读,部分线程同时写,大大提高了并发性能。 - 合理设置初始容量和负载因子:根据预估的元素数量设置合适的初始容量,避免频繁扩容。同时,根据业务场景调整负载因子,平衡空间和时间复杂度。
关键代码片段
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentMapExample {
private static final ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
public static void main(String[] args) {
// 写入操作
new Thread(() -> {
for (int i = 0; i < 1000; i++) {
concurrentMap.put("key" + i, i);
}
}).start();
// 读取操作
new Thread(() -> {
for (int i = 0; i < 1000; i++) {
Integer value = concurrentMap.get("key" + i);
if (value != null) {
System.out.println("Read value: " + value);
}
}
}).start();
}
}
在上述代码中,使用ConcurrentHashMap
进行高并发的读写操作。put
方法用于写入数据,get
方法用于读取数据,由于ConcurrentHashMap
的线程安全特性,在高并发环境下能够保证数据一致性和较好的性能。