文章目录
声明:
本博客是本人在学习《Java 并发编程的艺术》后整理的笔记,旨在方便复习和回顾,并非用作商业用途。
本博客已标明出处,如有侵权请告知,马上删除。
Java 程序员进行并发编程时,相比于其他语言的程序员而言要倍感幸福,因为并发编程大师 Doug Lea 不遗余力地为 Java 开发者提供了非常多的并发容器和框架。本章让我们一起来见识一下大师操刀编写的并发容器和框架,并通过每节的原理分析一起来学习如何设计出精妙的并发程序。
6.1 ConcurrentHashMap 的实现原理与使用
ConcurrentHashMap 是线程安全且高效的 HashMap。本节让我们一起研究一下该容器是如何在保证线程安全的同时又能保证高效的操作。
6.1.1 为什么要使用 ConcurrentHashMap
在并发编程中使用 HashMap 可能导致程序死循环。而使用线程安全的 HashTable 效率又非常低下,基于以上两个原因,便有了 ConcurrentHashMap 的登场机会。
(1)线程不安全的 HashMap
在多线程环境下,使用 HashMap 进行 put 操作会引起死循环,导致 CPU 利用率接近 100%,所以在并发情况下不能使用 HashMap。例如,执行以下代码会引起死循环。
final HashMap<String, String> map = new HashMap<String, String>(2);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
map.put(UUID.randomUUID().toString(), "");
}
}, "ftf" + i).start();
}
}
}, "ftf");
t.start();
t.join();
HashMap 在并发执行 put 操作时会引起死循环,是因为多线程会导致