【发布时间】:2016-10-03 08:48:11
【问题描述】:
第一种情况:假设你有很多任务都返回某种结果,我们现在就称之为“结果”,这些都必须存储在数组列表中。有两种选择:
1) 在 main 方法中创建一个 arraylist 并使用可访问共享列表和同步 add 方法的 runnables
2)在main方法中创建一个arraylist,使用callable执行任务并返回结果,让main方法将Result添加到它的list中。
两者之间是否有任何性能差异,因为可运行对象需要同步访问,但可调用对象不需要?
然后,对于第二种情况:现在假设每个任务生成一个“小”数组列表,假设每个任务少于 10 个项目。这又提供了两种选择:
1) main 和 runnables 中的一个 arraylist 可以访问共享列表,每当生成时添加结果项。
2) main 和 callables 中的一个 arrayList> 每个都有自己的本地 arraylist,用于存储结果,直到任务完成,然后在 main 中 addAll 用于添加找到的结果。
同样的问题,性能差异是什么?
为了清楚起见,在速度(一些同步问题等)和内存方面的性能(由于本地小数组列表,可调用对象是否使用更多内存,或者这个小到可以忽略不计)?
【问题讨论】:
-
为什么一定要ArrayList?
-
依赖一个实现是不好的做法,你需要依赖接口来代替
-
这取决于您的工作量。如果你有很多小任务,那么你应该关注锁开销。如果任务需要很长时间才能完成,那么首先考虑的应该是干净/可读的代码。
标签: java multithreading concurrency thread-safety shared-data