Collections.synchronizedList
在我的卑鄙看法中,
join()
方法可确保在主线程进行之前完成
CompletableFuture
任务执行的所有操作。这意味着CompletableFuture
任务对join()
任务进行的字段或对象的任何更新都将在join()
返回后可见主线程。但是我不确定这些字段的内存可见性。他们可能看不到
。注: 此示例是对更复杂情况的简化反映。在实践中,我知道我可以在完成后直接设置X对象(例如,x = future.join())。但是,我的实际用例涉及嵌套对象和跨多个线程共享状态,这就是为什么我专注于现场可见性和线程安全性。从
package java.util.concurrentdocs: 仅在读取操作之前,仅当写入操作发生时,一个线程的写入结果才能看到另一个线程的读取。
如果工人偶然进行的操作 - 从
CompletableFuture.join
我在官方文档中没有发现Future.get
与
CompletableFuture
.中有评论,并建议记录保证:共享相同的保证。 但是,在
https://bugs.openjdk.org/browse/jdk-8292365
由{@code future}-happen-beforeActions{@code future.get()},{@code future.result.resultnow()或{@code future.exceptionnow()},在另一个线程中。 通过{@code ploteabefuture.getnow}或{@code plotebefuture.join}。
这倾向于我认为
CompletableFuture.join
与
Future.get
Future.get
happen-before在被称为以前的动作以下操作:luther.get()在另一个线程中取回结果后的动作以后发生的异步计算所采取的措施。
不幸的是,没有关于https://bugs.openjdk.org/browse/browse/jdk-8292365..-happen-before保证
的明确声明,但是有一张票可以添加:CompletableFuture.join
。