【发布时间】: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