前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ArrayList在Java多线程中的应用

ArrayList在Java多线程中的应用

作者头像
用户2146693
发布2019-08-08 11:46:27
1.5K0
发布2019-08-08 11:46:27
举报
文章被收录于专栏:架构师进阶

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种解决方案,欢迎留言指正。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
  • 问题重现
  • 解决方案1
  • 解决方案2
  • 其他解决方案
  • 扩展
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档