gpt4 book ai didi

java - ExecutorService(特别是 ThreadPoolExecutor)线程安全吗?

转载 作者:IT老高 更新时间:2023-10-28 11:53:51 25 4
gpt4 key购买 nike

ExecutorService 是否保证线程安全?

我将来自不同线程的作业提交到同一个 ThreadPoolExecutor,我是否必须在交互/提交任务之前同步对执行器的访问?

最佳答案

(与其他答案相反)线程安全契约(Contract) is 记录在案:查看 interface javadocs(与方法的 javadoc 相反)。例如,在 ExecutorService 的底部您找到的 javadoc:

Memory consistency effects: Actions in a thread prior to the submission of a Runnable or Callable task to an ExecutorService happen-before any actions taken by that task, which in turn happen-before the result is retrieved via Future.get().

这足以回答这个问题:

"do I have to synchronize access to the executor before interacting/submitting tasks?"

不,你没有。无需外部同步即可构造和提交作业到任何(正确实现的)ExecutorService。这是主要的设计目标之一。

ExecutorService 是一个concurrent 实用程序,也就是说它的设计目的是为了最大程度地运行而不需要同步,以提高性能。 (同步会导致线程争用,这会降低多线程效率 - 特别是在扩展到大量线程时。)

无法保证任务将在未来什么时候执行或完成(有些甚至可能在提交它们的同一线程上立即执行),但是工作线程可以保证看到提交线程已执行的所有效果到提交点。因此(运行的线程)您的任务也可以安全地读取为其使用而创建的任何数据,而无需同步、线程安全类或任何其他形式的“安全发布”。提交任务的行为本身就足以将输入数据“安全发布”到任务。您只需要确保在任务运行时不会以任何方式修改输入数据。

同样,当你通过 Future.get() 取回任务的结果时,检索线程将保证看到执行器的工作线程所做的所有效果(在返回的结果中) ,加上工作线程可能做出的任何副作用更改)。

这个契约也暗示了任务本身提交更多的任务是可以的。

"Does the ExecutorService guarantee thread safety ?"

现在这部分问题更为笼统。例如,找不到关于方法 shutdownAndAwaitTermination 的线程安全契约(Contract)的任何声明 - 尽管我注意到 Javadoc 中的代码示例不使用同步。 (虽然可能有一个隐藏的假设,即关闭是由创建 Executor 的同一线程发起的,而不是例如工作线程?)

顺便说一句,我推荐《Java Concurrency In Practice》一书,作为并发编程领域的良好基础。

关于java - ExecutorService(特别是 ThreadPoolExecutor)线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1702386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com