一、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();
} }
}

最新文章

  1. 如何远程关闭一个ASP.NET Core应用?
  2. SQL删除语句同时向备份表插入数据
  3. 软件开发常用快捷键 &amp; 命令总结
  4. markdown语法学习笔记
  5. asp.net还原备份数据库(C#)
  6. cell1这个字符串如何截取掉前边的cell剩下后边的数字 后边数字长度不固定
  7. Delphi静态加载DLL和动态加载DLL示例
  8. iOS 开发常用的一些工具
  9. SAP Crystal Dashboard Design 2011 win7 x64 安装
  10. Java并发学习之二——获取和设置线程信息
  11. Web Server CA证书签名步骤和自签名测试,支持多域名
  12. CDOJ 631 敢说敢做 记忆化搜索and动规
  13. javascript设计模式——Module
  14. ocx控件避免弹出警告的类--2
  15. Thrift 代码分析
  16. Win8驱动的兼容性问题
  17. scp免密操作
  18. MariaDB 数据类型与运算符(4)
  19. Python删除文件及进行文件夹压缩
  20. springSecurity入门小demo--配置文件xml的方式

热门文章

  1. Go-常量-const
  2. C++中_T()和L的区别
  3. 题解 SP1026 【FAVDICE - Favorite Dice】
  4. 洛谷 P6851 【onu】贪心
  5. trie树——【吴传之火烧连营】
  6. thinkphp5.1 阿里云短信接口
  7. android的adb命令整理
  8. 2014年 实验二 B2C网上购物
  9. Java 集合看这一篇就够了
  10. 【Jenkins】远程调用jenkins进行构建方式!