所有异步任务可以同时读取一个 ArrayList 没有任何延迟
Posted
技术标签:
【中文标题】所有异步任务可以同时读取一个 ArrayList 没有任何延迟【英文标题】:Can all Asynchronous tasks read a ArrayList at sametime without anydelay 【发布时间】:2018-07-20 09:58:46 【问题描述】:在我的 android 应用中,我有一个如下所述的 arrayList。
Public List<String> prefCoinList = new ArrayList<String>() ;
如下所述,我将使用 THREAD_POOL_EXECUTOR 执行 10 个异步任务。
new asyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, order);
每个异步任务将仅读取 arrayList "prefCoinList" 并检查特定值。
问题
所有 10 个异步任务会在 arrayList "prefCoinList" 上运行而不会出现任何死锁吗?
会有任何线程锁/挂起问题吗?
如果可能同时读取数组列表,那么每个线程是否会获得自己的副本(或)所有线程将等待并在轮到它们时读取数组列表?
【问题讨论】:
【参考方案1】:如果列表在构造后没有被修改,那么您可以从多个线程访问它而不会出现问题。每个线程将读取对象的单个副本。
如果列表偶尔被修改,那么您可以使用ReadWriteLock 或其他访问控制机制。
【讨论】:
【参考方案2】:让我回答每个问题。 1) 是的,所有 10 个异步调用都将毫无问题地运行,需要处理的信息并不多。
2)你不会有线程锁,你只需要注意使用 runOnUIThread 因为在那一刻它会停止异步调用。
3) Java 函数通过对象的引用工作。所以,你有两个选择。您可以将相同的数组传递给异步函数,但不能对其进行修改,或者您可以为每个函数创建数组的副本以避免出现问题。
【讨论】:
您的观点3)
不正确。 Java 通过引用传递对象参数。以上是关于所有异步任务可以同时读取一个 ArrayList 没有任何延迟的主要内容,如果未能解决你的问题,请参考以下文章