本文从三方面展开:
- 并发有什么好处
- 并发带来的问题
- 这些问题如何解决
文末附 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 系统、树莓派等。