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

集合类不安全问题

集合
ArrayList不是线程安全类,在多线程同时写的情况下,会抛出java.util.ConcurrentModificationException异常
解决办法:
1.使用Vector(ArrayList所有方法加synchronized,太重)
2.使用Collections.synchronizedList()转换成线程安全类
3.使用java.concurrent.CopyOnWriteArrayList(推荐)
通过写时复制来实现读写分离,比如其add()方法,就是先复制一个新数组,长度为原数组长度+1,然后将新数组最后一个元素设为添加的元素

package com.xd.thread;import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;public class ListNoSafeDemo {public static void main(String[] args) {mapDemo();}private static void mapDemo() {
//        Map<String,String> map = new HashMap<>();Map<String,String> map = new ConcurrentHashMap<>();for (int i = 1; i < 10; i++) {new Thread(()->{map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,6));System.out.println(Thread.currentThread().getName()+"\t"+map);},String.valueOf(i)).start();}}private static void setDemo() {//Set<String> set = new HashSet<>();Set<String> set = new CopyOnWriteArraySet<>();for (int i = 1; i < 10; i++) {new Thread(()->{set.add(UUID.randomUUID().toString().substring(0,6));System.out.println(Thread.currentThread().getName()+"\t"+set);},String.valueOf(i)).start();}}private static void listDemo() {//List<String> list = new ArrayList();List<String> list = new CopyOnWriteArrayList();for (int i = 0; i < 10; i++) {new Thread(()->{list.add(UUID.randomUUID().toString().substring(0,6));System.out.println(Thread.currentThread().getName() +"\t" + list);},String.valueOf(i)).start();}}}
http://www.lryc.cn/news/534143.html

相关文章:

  • 【基于SprintBoot+Mybatis+Mysql】电脑商城项目之上传头像和新增收货地址
  • AI知识库和全文检索的区别
  • 20240817 联想 笔试
  • IntelliJ IDEA 安装与使用完全教程:从入门到精通
  • 【JVM详解一】类加载过程与内存区域划分
  • 250207-MacOS修改Ollama模型下载及运行的路径
  • Win10 部署llama Factory 推荐教程和遇到的问题
  • 如何在Android Studio中开发一个简单的Android应用?
  • ubuntu下迁移docker文件夹
  • 嵌入式面试题 C/C++常见面试题整理_7
  • 使用OBS推流,大华摄像头 srs服务器播放
  • CSS 组合选择符详解与实战示例
  • Window系统通过Docker本地安装ollama和deepseek
  • 镜头放大倍率和像素之间的关系
  • P3413 SAC#1 - 萌数
  • [RabbitMQ] RabbitMQ常见面试题
  • Java运行时数据区
  • 【03】 区块链分布式网络
  • 【SQL server】关于SQL server彻底的卸载删除。
  • 【含文档+PPT+源码】基于微信小程序的校园志愿者管理系统的设计与实现
  • Docker入门(Windows)
  • 深度求索(DeepSeek)的AI革命:NLP、CV与智能应用的技术跃迁
  • Mac本地体验LM studio
  • Spring Boot 线程池自定义拒绝策略:解决任务堆积与丢失问题
  • 解锁摄影潜能:全面解析相机镜头的选择与使用逻辑
  • 【Unity】从父对象中获取子对象组件的方式
  • 第六届MathorCup高校数学建模挑战赛-A题:淡水养殖池塘水华发生及池水自净化研究
  • webpack【初体验】使用 webpack 打包一个程序
  • <论文>DeepSeek-R1:通过强化学习激励大语言模型的推理能力(深度思考)
  • 公司配置内网穿透方法笔记