博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中并发下的集合类
阅读量:4513 次
发布时间:2019-06-08

本文共 1389 字,大约阅读时间需要 4 分钟。

java中常见的集合类大部分是非线程安全的,在多线程情况下会报并发修改异常(ConcurrentModificationException)

并发下的ArrayList类:

1 //集合类不安全的例子 2 public class CollectionNotSafe { 3  4     public static void main(String[] args) { 5  6         List
list = new ArrayList<>(); 7 for (int i = 0; i < 50; i++) { 8 new Thread(()->{ 9 list.add(UUID.randomUUID().toString().substring(0,8));10 System.out.println(list);11 },String.valueOf(i)).start();12 }13 14 }15 } 16 //运行结果: ConcurrentModificationException

解决办法:使用集合的工具类Collections包中的synchronizedList(),

或者直接使用java.util.concurrent包中的CopyOnWriteArrayList

List
saveList1 = Collections.synchronizedList(new ArrayList<>());List
saveList2 = new CopyOnWriteArrayList<>();

CopyOnWriteArrayList底层是一个volatile修饰的Object数组,add方法的代码为:

public boolean add(E e) {
final ReentrantLock lock = this.lock; lock.lock(); try {
Object[] elements = getArray(); int len = elements.length; Object[] newElements = Arrays.copyOf(elements, len + 1); newElements[len] = e; setArray(newElements); return true; } finally {
lock.unlock(); } }

set和map的道理与list的相同,都可以在concurrent包中找到线程安全的集合类(CopyOnWriteArraySet,ConcurrentHashMap),或者使用Collctions包中的方法。

 

转载于:https://www.cnblogs.com/dream2true/p/10771288.html

你可能感兴趣的文章
python基础之文件操作
查看>>
在eclipse里头用checkstyle检查项目出现 File contains tab characters (this is the first instance)原因...
查看>>
个人github链接及git学习心得总结
查看>>
c++ 计算器 带括号 代码实现
查看>>
objective -c初写
查看>>
C#中如何设置窗体的默认按钮和取消按钮
查看>>
[Swift]LeetCode276. 粉刷栅栏 $ Paint Fence
查看>>
[Swift]LeetCode351. 安卓解锁模式 $ Android Unlock Patterns
查看>>
break语句和continue语句
查看>>
java代码中添加log4j日志
查看>>
Java学习不走弯路教程(19 对于Service的自动注入)
查看>>
[CSS3] :empty Selector
查看>>
webpack4 入门(二)
查看>>
vim配置成c++IDE
查看>>
利用node搭建本地服务器
查看>>
python pickle命令执行与marshal 任意代码执行
查看>>
Elasticsearch 2.3 java api
查看>>
golang写入csv
查看>>
基础2
查看>>
java基础篇---网络编程(UDP程序设计)
查看>>