惠州网站建设推广正规手游代理平台有哪些
文章目录
- 多线程环境使⽤`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 =