您的位置:首页 > 编程语言 > Java开发

ArrayList在Java多线程中的应用

2017-08-17 00:00 197 查看
ArrayList是非线程安全的。

问题描述

开发中,存在这样的业务逻辑,类似倒金字塔结构,下层数据需要基于上层的数据进行逻辑计算。设计思路是:定义一个全局变量upLayerList,来保存上一层的数据。每一层计算仅需要知道upLayerList就可以,不用关心上一层数据怎么获取。当前层计算完毕后,把结果赋值给upLayerList,留给下一层使用。

问题重现

模拟业务逻辑实现:



实现多线程:



正常的输出:

Runner1 : [1, 2, 3]
Runner2 : [4, 5, 6]


实际输出:



线程1和线程2修改了彼此的list。

解决方案1

使用同步关键字
synchronized




线程1和线程2交叉运行输出:



解决方案2

传值,每一层都传upLayerList。



实际测试结果:



其他解决方案

定义变量:
uplayerList = Collections.synchronizedList(new ArrayList<>());
,uplayerList 是线程安全的,但是后面对uplayerList 的操作不是线程安全的。需要对操作加同步关键字
synchronized


扩展

ArrayList和Vector以及synchronizedList

以上是针对实际问题的2种解决方案,欢迎留言指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: