
这是 Java 最早提供的线程安全集合,现已基本被淘汰。
ArrayList)存储数据。add, get, size 等)上加上了 synchronized 关键字。this)。在多线程高并发环境下,这会导致严重的锁竞争和上下文切换,性能极差。通过 Collections.synchronizedList(new ArrayList<>()) 生成的包装类。
List(如 ArrayList)和一个对象锁(mutex)。synchronized (mutex) 代码块。如果不显式指定 mutex,默认锁住的就是包装类对象本身。Vector 稍微好一点点(因为锁的是代码块而不是整个方法,且没有引入废弃的老旧 API),但本质依然是互斥锁(排他锁),读读操作依然互斥,无法满足高并发下的读性能要求。Iterator 遍历这个安全的 List 时,必须在外部手动加锁。因为它的 iterator() 方法本身没有加锁,如果在遍历过程中其他线程修改了结构,依然会抛出 ConcurrentModificationException (快速失败机制 fail-fast)。这是 java.util.concurrent 包下专为**“读多写少”**场景量身定制的并发安全 List。
volatile 修饰的数组引用(private transient volatile Object[] array;),保证了数组指针修改时的内存可见性。add 或 set 等写操作时,它不会直接修改原数组,而是先获取锁(JDK 8 中是 ReentrantLock,JDK 11+ 优化为了更轻量的 synchronized)。volatile array 指针指向这个全新的数组,并释放锁。array 引用指向的数组。因为写操作是在副本上进行的,绝不会对当前读线程产生干扰。方案 | 底层核心机制 | 读操作是否加锁 | 迭代器机制 | 适用场景 |
|---|---|---|---|---|
Vector | synchronized 方法 | 是(互斥锁) | Fail-Fast | 已淘汰,遗留系统维护 |
SynchronizedList | synchronized 代码块 | 是(互斥锁) | Fail-Fast (需外部手动加锁) | 简单的低并发同步场景 |
CopyOnWriteArrayList | 独占锁 + 数组拷贝 + volatile | 否(完全无锁) | Fail-Safe (快照机制) | 读多写少、容忍最终一致性 |
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。