当前位置: 首页 > news >正文

【Java集合类不安全示例】

文章目录

  • 一、List
  • 二、Set
  • 三、Map


提示:以下是本篇文章正文内容,下面案例可供参考

一、List

代码如下(示例):

public class ZZZZZZZZZZ {public static void main(String[] args) {// ArrList 非线程安全的集合List<String> list1 = new ArrayList<>();for (int i = 0; i < 30; i++) {new Thread(() -> {// 多个线程同时向 ArrayList 添加元素list1.add(UUID.randomUUID().toString().substring(0, 8));System.out.println(list1);}).start();}}
}

输出结果

Exception in thread “Thread-1” Exception in thread “Thread-0” Exception in thread “Thread-4” Exception in thread “Thread-25” Exception in thread “Thread-23” Exception in thread “Thread-17” Exception in thread “Thread-18” Exception in thread “Thread-27” java.util.ConcurrentModificationException并发修改异常,由于ArrayList 不是线程安全的容器,多个线程并发添加元素,会导致竞争现象,最终产生该异常

故障出现

java.util.ConcurrentModificationException

导致原因

多线程并发争抢修改导致

解决方法

  • 使用线程安全的容器,例如:Vector,在该类中每个方法都加上了 synchronized,不会导致线程安全问题,但是由于锁的粒度太细,会导致程序的速度较慢。
  • 使用集合工具类的线程安全的方法,如:
static <T> List<T> Collections.synchronizedList(List<T> list)
  • juc 下面的 CopyOnWriteArrayList,该类使用使用 ReentrantLock 加锁解锁,每次添加新元素就会加锁,然后开辟比旧数组多1的空间,将原数组全部拷贝进去,再将新元素加到最后一个位置。由于每次添加元素都会拷贝原数组,如果原数组很大,就会对内存资源造成很大的消耗,因此适合读多写少的场景。源码如下:
             public boolean add(E e) {final ReentrantLock lock = this.lock;lock.lock();try {Object[] elements = getArray();int len = elements.length;Object[] newElements = Arrays.copyOf(elements, len + 1);newElements[len] = e;setArray(newElements);return true;} finally {lock.unlock();}}

二、Set

代码如下(示例):

public class ZZZZZZZZZZ {public static void main(String[] args) {// 非线程安全的 HashSetSet<String> set = new HashSet<>();for (int i = 0; i < 30; i++) {new Thread(() -> {set.add(UUID.randomUUID().toString().substring(0, 8));System.out.println(set);}).start();}}
}

故障出现

java.util.ConcurrentModificationException

导致原因

多线程并发争抢修改导致

解决方法

  • 使用集合工具类的线程安全的方法,如:
static <T> Set<T> Collections.synchronizedList(Set<T> s)
  • juc 下面的 CopyOnWriteArraySet,底层还是 CopyOnWriteArrayList,源码的构造方法如下:
    public CopyOnWriteArraySet() {al = new CopyOnWriteArrayList<E>();}

三、Map

代码如下(示例):

public class ZZZZZZZZZZ {public static void main(String[] args) {// 非线程安全的 HashMapMap<String, String> map = new HashMap<>();for (int i = 0; i < 30; i++) {new Thread(() -> {map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0, 8));System.out.println(map);}).start();}}
}

故障出现

java.util.ConcurrentModificationException

导致原因

多线程并发争抢修改导致

解决方法

  • 使用线程安全的容器,如:ConcurrentHashMap

  • 使用集合工具类的线程安全的方法,如:

static <K, V> Map<K, V> Collections.synchronizedMap(Map<K, V> m)
http://www.lryc.cn/news/268650.html

相关文章:

  • cpp_07_类型转换构造_析构函数_深拷贝_静态成员
  • Java 已死、前端已凉?
  • Calico IP_AUTODETECTION_METHOD
  • 百分点科技成为中国“数据要素×”生态合作伙伴
  • 智能优化算法应用:基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • Redis自动部署脚本编写
  • Tinker 环境下数据表的用法
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之线性布局容器Row组件
  • JAVA——JDBC学习
  • Flask 用户信息编辑系统
  • Spring DefaultListableBeanFactory源码分析
  • 关于MySQL、分布式系统、SpringCloud面试题
  • 2023年中职“网络安全”——B-5:网络安全事件响应(Server2216)
  • 【论文解读】Learning based fast H.264 to H.265 transcoding
  • [vue]Echart使用手册
  • 视频人脸识别马赛克处理
  • 2023-12-27 Python PC获取鼠标位置,移动鼠标到相应的位置 定时自动模拟鼠标点击,用于简单测试app用
  • 如何解决服务器CA证书过期的问题
  • 计算机基础面试题总结
  • 【算法练习】leetcode链表算法题合集
  • 2023.12.28每日一题
  • 231227-9步在RHEL8.8配置本地yum源仓库
  • 5. 创建型模式 - 单例模式
  • 机器学习之人工神经网络(Artificial Neural Networks,ANN)
  • GetLastError()详细介绍
  • 【unity3D-粒子系统】粒子系统主模块-Particle System篇
  • Windows搭建FTP服务器教学以及计算机端口介绍
  • 安防视频监控系统EasyCVR实现H.265视频在3秒内起播的注意事项
  • CNN实现对手写字体的迭代
  • docker学习笔记01-安装docker