集合类-多线程下不安全及其解决办法

el/2024/2/25 23:53:21

1 List 不安全

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;class test1{public static void main(String[] args) {//java.util.ConcurrentModificationException 并发修改异常!//List<String> list = new ArrayList<String>();// 并发下 ArrayList 不安全的/*** 解决方案;* 1、List<String> list = new Vector<>();* 2、List<String> list = Collections.synchronizedList(new ArrayList<>());* 3、List<String> list = new CopyOnWriteArrayList<>();*/// CopyOnWrite 写入时复制  COW  计算机程序设计领域的一种优化策略;// 多个线程调用的时候,list,读取的时候,固定的,写入(覆盖)// 在写入的时候避免覆盖,造成数据问题!// 读写分离//List<String> list = Collections.synchronizedList(new ArrayList<>());//List<String> list = new Vector<String>();List<String> list = new CopyOnWriteArrayList<String>();for (int i = 0; i < 10; i++) {new Thread(()->{list.add(UUID.randomUUID().toString().substring(0,5));System.out.println(list);},"a").start();}}
}

2. Set 不安全

hashSet 底层是什么? 其本质就是一个HashMap,只是key不能重复!

public HashSet() {this.map = new HashMap();
}// add set 本质就是 map key是无法重复的!
public boolean add(E e) {return map.put(e, PRESENT)==null;
}
private static final Object PRESENT = new Object(); // 不变得值!
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;class test1{public static void main(String[] args) {// HashSet并发下会报异常:  java.util.ConcurrentModificationException// Set<String> set = new HashSet<>();// 解决办法:// 1) Set<String> set = Collections.synchronizedSet(new HashSet<>());// 2) Set<String> set = new CopyOnWriteArraySet<>();Set<String> set = new CopyOnWriteArraySet<>();for (int i = 1; i <=30 ; i++) {new Thread(()->{set.add(UUID.randomUUID().toString().substring(0,5));System.out.println(set);},String.valueOf(i)).start();}}
}

3. hashMap不安全

import java.util.concurrent.ConcurrentHashMap;class test1{public static void main(String[] args) {// Map<String, String> map = new HashMap<>();Map<String, String> map = new ConcurrentHashMap<>();for (int i = 1; i <=30; i++) {new Thread(()->{map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,5));System.out.println(map);},String.valueOf(i)).start();}}}

 


http://www.ngui.cc/el/4893738.html

相关文章

四大函数式接口(必需掌握)

新时代的程序员: lambda表达式、链式编程、函数式接口、Stream流式计算 1. 函数式接口: 只有一个方法的接口 @FunctionalInterface public interface Runnable {void run(); }// 简化编程模型,在新版本的框架底层大量应用! 只要是 函数型接口 就可以 用 lambda表达式简化: …

ForkJoin与Stream并行流

ForkJoin 在 JDK 1.7 , 并行执行任务!提高效率。大数据量! ForkJoin 特点:工作窃取 这个里面维护的都是双端队列 以下计算1-10_0000_0000的和,for循环与ForkJoin效率差别不大,但是使用Stream并行流效果显著!!! import java.util.*; import java.util.concurrent.Executi…

Volatile-内存屏障

Java 中如何保证底层操作的有序性和可见性&#xff1f;可以通过内存屏障。 内存屏障是被插入两个 CPU 指令之间的一种指令&#xff0c;用来禁止处理器指令发生重排序&#xff08;像屏障一样&#xff09;&#xff0c;从而保障有序性的。 另外&#xff0c;为了达到屏障的效果&a…

单例模式安全之反射攻击

单例模式这里就不谈了&#xff0c;什么是单例模式可参考七种Java单例模式详解,这里是关于单例模式安全方面的&#xff0c;当然了这里说的安全不是线程安全。 什么是反射攻击呢 在Java中&#xff0c;由于反射的功能实在是太强了&#xff0c;通过动态访问类并设置Access(如setA…

ubuntu 解决优盘文件 read-only file system 问题

1.进入root: sudo su2.显示分区&#xff1a; df -Th 结果如下&#xff1a; Filesystem Type Size Used Avail Use% Mounted on udev devtmpfs 3.8G 0 3.8G 0% /dev tmpfs tmpfs 784M 9.5M 775M 2% /run /dev/sdb2 ext4 …

Mybatis Mapper接口是如何找到实现类的-源码分析

转载自:https://www.cnblogs.com/demingblog/p/9544774.html KeyWords: Mybatis 原理,源码,Mybatis Mapper 接口实现类,代理模式,动态代理,Java动态理,Proxy.newProxyInstance,Mapper 映射,Mapper 实现 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程…

HikariCP连接池监控

Spring-Boot-2.0.0-M1 版本将默认的数据库连接池从tomcat jdbc pool改为了hikari&#xff0c;通过HikariCP可以分析慢查询是什么导致的&#xff01;

springboot—spring aop 实现系统操作日志记录存储到数据库

采用方案&#xff1a; 使用spring 的 aop 技术切到自定义注解上&#xff0c;针对不同注解标志进行参数解析&#xff0c;记录日志 缺点&#xff1a;要针对每个不同的注解标志进行分别取注解标志&#xff0c;获取参数进行日志记录输出 1. 需要引用的依赖 <!--spring切面aop依…

在 Ubuntu 16.04 上安装 Vagrant

本文引用自:https://yq.aliyun.com/articles/763504 Vagrant是一个命令行工具,用于构建和管理虚拟开发环境。 默认情况下,Vagrant 在 VirtualBox, Hyper-V, 和 Docker 之上准备环境。支持其他提供者,例如, Libvirt (KVM), VMware and AWS 可以通过 Vagrant 插件系统启用…

CXF 客户端 远程调用WebService

1. 添加如下依赖: <!-- CXF webservice --> <dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-spring-boot-starter-jaxws</artifactId><version>3.1.11</version> </dependency> <!-- CXF webservic…