线程安全的集合类
文章目录
-
- 多线程环境使⽤`ArrayList`
-
- 线程不安全
- 线程安全
-
- 可以使用 `ReentrantLock` 或 `synchronized`来保护 `ArrayList` 的访问。
- 使用同步包装器
- 使用 `CopyOnWriteArrayList`
- **“写时复制”机制**
- 多线程环境使⽤队列
- 多线程环境使⽤哈希表
-
- Hashtable
- ConcurrentHashMap
- HashMap、HashTable、ConcurrentHashMap的区别
Vector
、
Stack
、
HashTable
是线程安全的,但不建议⽤,其他的集合类不是线程安全的。
多线程环境使⽤ArrayList
在单线程环境下不涉及线程安全问题,但是,在多线程环境中直接使用 ArrayList
是不安全的。
线程不安全
如果多个线程同时对同一个 ArrayList
进行读写操作(尤其是写操作),可能会导致数据不一致或抛出异常(如 ConcurrentModificationException
)。
package com.zxy.lesson12;
import java.util.ArrayList;
import java.util.List;
public class Demo12_03 {
public static void main(String[] args) {
// 先定义一个集合对象(线程不安全)
List<Integer> list = new ArrayList<>();
// 多个线程同时对这个集合进行读写操作--线程不安全
for (int i = 0; i < 10; i++) {
int j = i + 1;
Thread t = new Thread(() -> {
// 写
list.add(j);
// 读
System.out.println(list);
});
// 启动线程
t.start();
}
}
}
线程安全
可以使用 ReentrantLock
或 synchronized
来保护 ArrayList
的访问。
使用同步包装器
可以通过 Collections.synchronizedList()
方法将 ArrayList
包装为线程安全的集合。
package com.zxy.lesson12;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Demo12_04 {
public static void main(String[] args) {
// 创建一个普通集合对象
List<Integer> arrayList =