JUC- 集合的线程安全

本文详细探讨了Java中List集合的线程安全问题,通过实例分析了ArrayList的并发修改异常,介绍了Vector的线程安全特性,以及如何通过Collections的synchronizedList方法实现线程安全。重点讲解了CopyOnWriteArrayList的工作原理和适用场景,强调其在读多写少的情况下的高效性,并指出其线程安全是通过动态数组和互斥锁实现的。
摘要由CSDN通过智能技术生成

List集合线程不安全操作

集合线程不安全案例

package com.atguigu.test;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
 * 集合线程安全案例
 */
    public class NotSafeDemo {
   
    /**
     * 多个线程同时对集合进行修改 
     * @param args
     */
    public static void main(String[] args) {
   
        List list = new ArrayList();
        for (int i = 0; i < 100; i++) {
   
            new Thread(() ->{
   
                list.add(UUID.randomUUID().toString());
                System.out.println(list);
            }, "线程" + i).start();
        }
    }
}

异常内容
java.util.ConcurrentModificationException
问题: 为什么会出现并发修改异常?
查看 ArrayList 的 add 方法源码

public boolean add(E e) {
   
    ensureCapacityInternal(size + 1);
    // Increments modCount!! elementData[size++] = e;
    return true;
}

那么我们如何去解决 List 类型的线程安全问题?

Vector

Vector 是矢量队列,它是 JDK1.0 版本添加的类。

  • 继承于 AbstractList,实现了 List, RandomAccess, Cloneable 这些接口。
  • Vector 继承了 AbstractList, 实现了 List;所以,它是一个队列,支持相关的添加、删除、修改、遍历等功能。
  • Vector 实现了 RandmoAccess 接口,即提供了随机访问功能。
  • RandmoAccess 是 java 中用来被 List 实现,为 List 提供快速访问功能的。
  • 在 Vector 中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。
    Vector 实现了 Cloneable 接口,即实现 clone()函数。它能被克隆。
  • 和 ArrayList 不同,Vector 中的操作是线程安全的。

List集合线程安全案例1

NotSafeDemo 代码修改

package com.atguigu.test;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.Vector;
/**
 * 集合线程安全案例
 */
public class NotSafeDemo {
   
    /**
     * 多个线程同时对集合进行修改 
     * @param args
     */
    public static void main(String[] args) {
   
        List list = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值