线程安全的集合类

文章目录

    • 多线程环境使⽤`ArrayList`
      • 线程不安全
      • 线程安全
        • 可以使用 `ReentrantLock` 或 `synchronized`来保护 `ArrayList` 的访问。
        • 使用同步包装器
        • 使用 `CopyOnWriteArrayList`
        • **“写时复制”机制**
    • 多线程环境使⽤队列
    • 多线程环境使⽤哈希表
      • Hashtable
      • ConcurrentHashMap
      • HashMap、HashTable、ConcurrentHashMap的区别

VectorStackHashTable 是线程安全的,但不建议⽤,其他的集合类不是线程安全的。

多线程环境使⽤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();
        }
    }
}

线程安全

可以使用 ReentrantLocksynchronized来保护 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 =

你可能感兴趣的:(JavaEE,安全,windows,jvm)