本文从三方面展开:
- 并发有什么好处
- 并发带来的问题
- 这些问题如何解决
文末附 synchronized、volatile 关键字解析,其他并发包下内容,请参考后续文章。
1. 并发有什么好处
并发可以充分利用CPU资源,降低系统响应时间,提升系统吞吐量。
并发处理的广泛应用是使得 Amdahl 定律代替摩尔定律成为计算机性能发展源动力的根本原因,也是人类“压榨”计算机运算能力的最有力武器。 —— 引自《深入理解Java虚拟机》
本文从三方面展开:
文末附 synchronized、volatile 关键字解析,其他并发包下内容,请参考后续文章。
并发可以充分利用CPU资源,降低系统响应时间,提升系统吞吐量。
并发处理的广泛应用是使得 Amdahl 定律代替摩尔定律成为计算机性能发展源动力的根本原因,也是人类“压榨”计算机运算能力的最有力武器。 —— 引自《深入理解Java虚拟机》
TreeMap 是 Java 中基于 红黑树(Red-Black Tree) 实现的有序映射,支持自定义的排序规则。
不得不提,TreeMap 的代码读起来,既精简又优雅,很适合学习红黑树。
static final class Entry<K,V> implements Map.Entry<K,V> {
K key; // 键
V value; // 值
Entry<K,V> left; // 左子节点
Entry<K,V> right; // 右子节点
Entry<K,V> parent; // 父节点
boolean color = BLACK; // 颜色标记(默认黑色)
Entry(K key, V value, Entry<K,V> parent) {
this.key = key;
this.value = value;
this.parent = parent;
}
}
常用的 Set 实现类包括 HashSet、LinkedHashSet 和 TreeSet,它们基于不同的底层数据结构实现。
HashMap 实现,元素作为 HashMap 的键存储,值统一为 PRESENT(一个静态占位对象)。null:允许存储一个 null 元素。LinkedHashMap 是 Java 中基于哈希表和双向链表实现的有序 Map,它继承自 HashMap,支持按插入顺序或访问顺序(如 LRU 缓存)遍历元素。
LinkedHashMap 的节点继承自 HashMap.Node,并扩展了双向链表的前驱(before)和后继(after)指针:
static class Entry<K,V> extends HashMap.Node<K,V> {
Entry<K,V> before, after; // 双向链表指针
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}
LinkedList 是 Java 集合框架中基于 双向链表 实现的列表,支持高效的头部和尾部操作,同时实现了 List 和 Deque 接口,可作为动态列表、队列或双端队列使用。
每个节点包含数据(item)、前驱指针(prev)和后继指针(next):
在 Java 中,Stack 和 Deque 的设计差异反映了不同时期集合框架的理念。Stack 作为早期设计存在一些明显缺陷,而 Deque 接口的引入(Java 6)解决了这些问题并提供了更现代的替代方案。以下是它们的主要设计问题对比:
Stack 的问题:
Stack 直接继承自 Vector(一个线程安全的动态数组实现),导致其设计高度耦合于 Vector 的实现细节。
Stack 通过继承获得 Vector 的同步逻辑,但栈的逻辑(后进先出,LIFO)与动态数组的随机访问特性并不完全匹配。Stack 无法灵活扩展其他类。Deque 的优势:
Deque 是一个接口(如 ArrayDeque、LinkedList 是其实现),允许开发者根据需要选择底层数据结构,避免与具体实现耦合。
ArrayDeque 基于数组实现(高效随机访问),LinkedList 基于链表(高效插入删除)。ConcurrentHashMap 是 Java 并发编程中最重要的数据结构之一,其通过 CAS + synchronized 锁细化 和 多线程协同扩容 实现了高效的线程安全。
JDK 1.7 的分段锁(Segment)
数据结构:
并发控制:
JDK 1.8 的 CAS + synchronized
数据结构:
并发控制:
HashMap 是基于数组 + 链表/红黑树实现的,支持自动扩容。
优点:高效的查找/插入(平均O(1),最差O(n))、动态扩容、支持null键和null值
缺点:哈希冲突可能影响性能、线程不安全、内存占用较高
适合的场景:适合单线程高频查询场景
是否线程安全:HashMap是线程不安全的,如果需要线程安全,推荐使用 ConcurrentHashMap。用 Collections synchronizedMap() 也可以实现线程安全。

本人从事 Java 开发工作,至今有将近7年的时间。
常用的技术栈有 Spring、MyBatis、HSF、MetaQ、SchedulerX、Switch、Diamond、TDDL、ODPS 等。
前端方面,熟悉 React、Vue 的开发,目前常用的是 React。
服务器方面,熟悉主流 Linux 系统、树莓派等。