所有异步任务可以同时读取一个 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 没有任何延迟的主要内容,如果未能解决你的问题,请参考以下文章

异步执行的运行机制

同步 ,异步,并发/并行,串行

Python 异步IO

在完成所有任务之前关闭 ProcessPoolExecutor 的异步

异步,闭包和fetch

js执行机制(学习笔记)