java.util.concurrent.Future是线程安全的吗?

java.util.concurrent.Future是线程安全的吗?,java,multithreading,java.util.concurrent,Java,Multithreading,Java.util.concurrent,我正在试图找到说明java.util.concurrent.Future是否是线程安全的文档。我可以安全地将相同的Future实例提供给多个线程吗?这些线程都将调用Future.get(…) 我已经用这种方式测试了使用Future的代码,它似乎工作得很好,但如果我能找到文档化的期望,即Future可以以这种方式安全地进行并发访问,我会更高兴 谢谢。如果您使用的是从ExecutorService返回的Future,则可以保证它们是线程安全的。因为Future是一个接口,所以接口的创建者不能保证所有

我正在试图找到说明java.util.concurrent.Future是否是线程安全的文档。我可以安全地将相同的Future实例提供给多个线程吗?这些线程都将调用Future.get(…)

我已经用这种方式测试了使用Future的代码,它似乎工作得很好,但如果我能找到文档化的期望,即Future可以以这种方式安全地进行并发访问,我会更高兴


谢谢。

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


不过,Nizet确实提出了一个很好的观点。doc说Future接口的实现应该是线程安全的,如果不使实现线程安全,那么将违反Future的合同

,因为Future将由多个线程使用(至少是提交的线程和设置结果的线程),鉴于文档指定异步计算和get调用后发生的操作之间存在“先发生后发生”关系,我假设这些实现是线程安全的(至少是标准实现)。

本质上,此注释与Nizet的回答相同:您可以在JDK javadoc中看到内存一致性保证:阅读“由Future表示的异步计算执行的操作在另一个线程中通过Future.get()检索结果之后的操作之前发生”是否安全对于许多其他线程以及单个其他线程也是如此“另一个线程”字面意思是一个单独的线程,而不是许多线程。Ofc看来未来的实现者可能不得不不遗余力地让它为许多人中断并为一个人工作,所以我强烈怀疑这在现实中是安全的。是的,因为对
Future.get()
的每次调用都将受到“在之前发生”的保证。这是因为编译到同一程序集的每个调用都涉及一种或另一种形式的注释,所有线程都将阻止等待get()的结果。如果get()的结果是可变的,那么所有线程可能不会观察到相同的值。我强烈倾向于同意,考虑到在2个线程之间工作之前发生的线程安全通常也适用于N个线程,因此它实际上几乎肯定是安全的,然而,我不是100%的清楚,如果我可以解释之前发生的保证为许多线程时,保证的措辞建议一个单一的其他线程。尽管有点保留意见,我还是对你的评论投了赞成票,因为这似乎是最好的答案。@S42你读的措辞太字面了。在Java中,一对线程之间绝对没有特殊的通信;所有线程都通过同步内存进行通信,并且它对所有线程都是同等可用的。