【问题标题】:Is java.util.concurrent.Future threadsafe?java.util.concurrent.Future 线程安全吗?
【发布时间】:2012-01-13 11:41:06
【问题描述】:

我正在尝试查找说明 java.util.concurrent.Future 是否是/不是线程安全的文档。例如,我可以安全地将同一个 Future 实例提供给多个线程,它们都将调用 Future.get(...)?

我已经以这种方式使用 Future 测试了代码,它似乎工作正常,但如果我能找到记录的期望,即未来以这种方式并发访问是安全的,我会更高兴。

谢谢。

【问题讨论】:

  • 本质上,这条评论和 Nizet 的回答一样:你可以在 JDK javadoc 中看到内存一致性保证:docs.oracle.com/javase/6/docs/api/java/util/concurrent/…
  • 阅读“在另一个线程中通过 Future.get() 检索结果之后由 Future 发生的异步计算所采取的操作是否安全。”对于 许多 其他线程以及单个其他线程是否如此? - “另一个线程”字面意思是指 单个 其他线程,而不是多个线程。 Ofc 似乎未来的实施者可能不得不竭尽全力让它为许多人打破并为一个人工作,所以我强烈怀疑这在现实中是安全的。
  • 是的,因为对Future.get() 的每次调用都将在“之前发生”的保证之下。这是因为每个调用都编译为同一个程序集,涉及一种或另一种形式的en.wikipedia.org/wiki/Memory_barrier
  • 请注意,所有线程都会阻塞等待 get() 的结果。如果 get() 的结果是可变的,所有线程可能不会观察到相同的值。

标签: java multithreading java.util.concurrent


【解决方案1】:

鉴于 Future 旨在供多个线程使用(至少是提交的线程和设置其结果的线程),并且文档指定异步计算和异步计算之间存在先发生关系在 get 调用之后发生的操作,我会假设实现是线程安全的(至少是标准实现)。

【讨论】:

  • 我强烈倾向于同意它在现实中几乎肯定是安全的,因为在 2 个线程之间工作的线程安全通常也适用于 N 个线程,但我不是 100当保证的措辞暗示一个其他线程时,我是否可以将happens-before解释为许多线程的保证。尽管有一点小小的保留,我还是投票赞成你的评论,因为它似乎是最好的答案。
  • @S42 你读的字面意思太严格了。在Java中,一对线程之间绝对没有特殊的通信;所有线程通过同步内存进行通信,它对所有线程都是平等的。
【解决方案2】:

如果您使用从ExecutorService 返回的Future,那么可以保证它们是线程安全的。由于 Future 是一个接口,因此接口的创建者不能保证所有实现都是线程安全的。

Nizet 确实提出了一个很好的观点。文档说 Future 接口的实现应该是线程安全的,不使实现线程安全会违反 Future 的合同

【讨论】:

    猜你喜欢
    • 2020-04-15
    • 2011-07-04
    • 2014-04-26
    • 2012-11-30
    • 2010-12-30
    • 2013-03-12
    • 2021-08-03
    • 2010-12-27
    • 2018-06-04
    相关资源
    最近更新 更多