JUC---07解决集合线程不安全
一、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();
} }
}
JUC---07解决集合线程不安全的更多相关文章
- 解决ArrayList线程不安全
前些天做项目时,程序出现意外的问题,经后来分析是使用ArrayList这个线程不安全的方法导致 解决这个问题通常有两种方法(个人认为) 一:使用synchronized关键字,这个大家应该都很熟悉了, ...
- android 解决子线程进行UI操作
Android确实不允许在子线程中进行UI操作的,但我们有时必须在子线程里去执行一些耗时的任务,然后根据任务的执行结果来更新相应的UI控件. Android提供了一套异步消息处理机制,可以解决子线程中 ...
- JUC源码分析-线程池篇(三)ScheduledThreadPoolExecutor
JUC源码分析-线程池篇(三)ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor 继承自 ThreadPoolExecutor.它主要用来在 ...
- JUC源码分析-线程池篇(二)FutureTask
JUC源码分析-线程池篇(二)FutureTask JDK5 之后提供了 Callable 和 Future 接口,通过它们就可以在任务执行完毕之后得到任务的执行结果.本文从源代码角度分析下具体的实现 ...
- JUC源码分析-线程池篇(三)Timer
JUC源码分析-线程池篇(三)Timer Timer 是 java.util 包提供的一个定时任务调度器,在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次. 1. Ti ...
- JUC源码分析-线程池篇(一):ThreadPoolExecutor
JUC源码分析-线程池篇(一):ThreadPoolExecutor Java 中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池 ...
- Java 集合 线程安全
Java中常用的集合框架中的实现类HashSet.TreeSet.ArrayList.ArrayDeque.LinkedList.HashMap.TreeMap都是线程不安全的,如果多个线程同时访问它 ...
- List 集合线程安全测试
最近在做一些代码整理工作,涉及到List 线程安全问题,查了一些资料.网上有些资料说List 增减成员(Add , Remove) 是安全的,但不保证成员属性值访问安全性,及禁止对 List 跨线程遍 ...
- 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~ 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
看两个例子,一个是在一个进程里设置另外一个进程中控件的属性.另外一个是在一个进程里获取另外一个进程中控件的属性. 第一个例子 最近,在做一个使用线程控制下载文件的小程序(使用进度条控件显示下载进度)时 ...
随机推荐
- burp suite 之 intruder(入侵者)
intruder:包括自动提交请求的功能 登录密码 撞库 注入 脱裤 Fuzz Burp intruder包含四个模块: Target:攻击的网站目标的详情信息 Positions :用来设置攻击类型 ...
- HTML你好!
初识HTML 什么是HTML web的本意是蜘蛛网和网的意思,在网页设计中我们称为网页的意思.现广泛译作网络.互联网等技术领域.表现为三种形式,即超文本(hypertext).超媒体(hypermed ...
- springmvc 源码分析(二)-- DiapartcherServlet核心调用流程分析
测试环境搭建: 本次搭建是基于springboot来实现的,代码在码云的链接:https://gitee.com/yangxioahui/thymeleaf.git 项目结构代码如下: 一: cont ...
- Azure 内容审查器之文本审查
内容审查器 Azure 内容审查器也是一项认知服务.它支持对文本.图形.视频进行内容审核.可以过滤出某些不健康的内容,关键词.使你的网站内容符合当地的法律法规,提供更好的用户体验. 文本内容审核 其中 ...
- 009 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 03 什么是变量?
009 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 03 什么是变量? 什么是变量? 形象化的生活中的例子理解什么是变量以及变量的三个元素 我们可以根据客人要求 ...
- C++ 中explicit的作用
转载:https://www.cnblogs.com/diligenceday/p/5781408.html C++ 中explicit的作用 explicit作用: 在C++中,explicit ...
- C++中try&catch
参考: https://blog.csdn.net/xueluowutong/article/details/81257654 在c++中,可以直接抛出异常之后自己进行捕捉处理,如:(这样就可以在 ...
- OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 下面 ...
- SCOI 2008 【奖励关】
早上的考试一道都做不出,被教做人,心态爆炸ing...... 题目描述: 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必 ...
- PHP的学习(提前学习了,业余爱好) (一)
一个函数一个函数地堆 strstr()函数 在本地测试的时候,代码与显示如下 1.代码: <?php echo strstr("I love Shanghai!123",&q ...