JUC---07解决集合线程不安全
2024-09-06 19:57:25
一、ArrayList是线程不安全的,可以使用以下操作解决:
1.使用相同功能的集合类替换,比如Vector集合是线程安全的,他们实现的接口都是一样的,但是Vector类是在jdk1.0出现的,不推荐使用
2.使用 java.util.Collections类里面的静态方法synchronizedXXX(xxx),把不安全的集合当参数放进去。
3.使用java.util.concurrent.CopyOnWriteArrayList或java.util.concurrent.CopyOnWriteArraySet
二、从上面第二个知道Map与Set都是线程不安全的,其中Map的第三个解决方法是 java.util.concurrent.ConcurrentHashMap
三、代码实现
package com.jenne.mydemo; import org.junit.jupiter.api.Test; import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet; public class TestCollection {
@Test
public void testList() {
/* //可能会出现java.util.ConcurrentModificationException
List<String> list = new ArrayList<>();
for (int i = 1; i <= 8; i++) {
new Thread(() -> {
list.add(Thread.currentThread().getName()+"--->测试");
System.out.println(list);
}).start();
}*/ /*List<String> list = new Vector<>();//不推荐
for (int i = 1; i <= 6; i++) {
new Thread(() -> {
list.add(Thread.currentThread().getName()+"--->测试");
System.out.println(list);
}).start();
}*/ /*List<String> list = Collections.synchronizedList(new ArrayList<>());//不推荐
for (int i = 1; i <= 6; i++) {
new Thread(() -> {
list.add(Thread.currentThread().getName()+"--->测试");
System.out.println(list);
}).start();
}*/ List<String> list = new CopyOnWriteArrayList<>();//推荐使用
for (int i = 1; i <= 6; i++) {
new Thread(() -> {
list.add(Thread.currentThread().getName() + "--->测试");
System.out.println(list);
}).start();
}
} @Test
public void testSet() {
/*//java.util.ConcurrentModificationException
Set<String> set = new HashSet<>();
for (int i = 1; i <= 16; i++) {
new Thread(() -> {
set.add(Thread.currentThread().getName()+"--->测试");
System.out.println(set);
}).start();
}*/ /* Set<String> set = Collections.synchronizedSet(new HashSet<>());//不推荐
for (int i = 1; i <= 16; i++) {
new Thread(() -> {
set.add(Thread.currentThread().getName()+"--->测试");
System.out.println(set);
}).start();
}*/ Set<String> set = new CopyOnWriteArraySet<>();//推荐使用
for (int i = 1; i <= 16; i++) {
new Thread(() -> {
set.add(Thread.currentThread().getName() + "--->测试");
System.out.println(set);
}).start();
}
} @Test
public void testMap() {
/*//java.util.ConcurrentModificationException
Map<String,String> map = new HashMap<>();
for (int i = 1; i <= 16; i++) {
new Thread(() -> {
map.put(Thread.currentThread().getName(),"--->测试");
System.out.println(map);
}).start();
}*/ /*Map<String, String> map = Collections.synchronizedMap(new HashMap<>());//不推荐
for (int i = 1; i <= 16; i++) {
new Thread(() -> {
map.put(Thread.currentThread().getName(), "--->测试");
System.out.println(map);
}).start();
}*/ Map<String,String> map = new ConcurrentHashMap<>();//推荐使用
for (int i = 1; i <= 16; i++) {
new Thread(() -> {
map.put(Thread.currentThread().getName(),"--->测试");
System.out.println(map);
}).start();
} }
}
最新文章
- 如何远程关闭一个ASP.NET Core应用?
- SQL删除语句同时向备份表插入数据
- 软件开发常用快捷键 &; 命令总结
- markdown语法学习笔记
- asp.net还原备份数据库(C#)
- cell1这个字符串如何截取掉前边的cell剩下后边的数字 后边数字长度不固定
- Delphi静态加载DLL和动态加载DLL示例
- iOS 开发常用的一些工具
- SAP Crystal Dashboard Design 2011 win7 x64 安装
- Java并发学习之二——获取和设置线程信息
- Web Server CA证书签名步骤和自签名测试,支持多域名
- CDOJ 631 敢说敢做 记忆化搜索and动规
- javascript设计模式——Module
- ocx控件避免弹出警告的类--2
- Thrift 代码分析
- Win8驱动的兼容性问题
- scp免密操作
- MariaDB 数据类型与运算符(4)
- Python删除文件及进行文件夹压缩
- springSecurity入门小demo--配置文件xml的方式