Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java并发性:提交给executor的任务所做的更改在future.get()之后可见_Java_Concurrency_Visibility - Fatal编程技术网

Java并发性:提交给executor的任务所做的更改在future.get()之后可见

Java并发性:提交给executor的任务所做的更改在future.get()之后可见,java,concurrency,visibility,Java,Concurrency,Visibility,假设提交给executor池的任务如下所示 class Task implements Future<Boolean> { public HeavyClass heavyClass; public Task(HeavyClass heavyClass) { this.heavyClass = heavyClass; } public Boolean call() { try { //do changes to heavyClass retu

假设提交给executor池的任务如下所示

class Task implements Future<Boolean> {
 public HeavyClass heavyClass;
 public Task(HeavyClass heavyClass) {
    this.heavyClass = heavyClass;
 }

 public Boolean call() {
   try {
     //do changes to heavyClass
     return true;
   } catch(Exception e) {
      return false;
   }
 }
类任务实现未来{
公共重型车辆;
公共任务(重类重类){
this.heavyClass=heavyClass;
}
公共布尔调用(){
试一试{
//对重磅级进行更改
返回true;
}捕获(例外e){
返回false;
}
}
现在在调用线程中,我做了

Future<boolean> future = executor.submit(new Task(heavyClass));
try {
  boolean success = future.get();
  if (success) {
      //Assume all changes made to heavyClass are visible
  }
}
Future-Future=executor.submit(新任务(重类));
试一试{
布尔成功=future.get();
如果(成功){
//假设对heavyClass所做的所有更改都是可见的
}
}

这是正确的吗?据我所知,这并不是严格正确的。在这种情况下,确保纠正的最佳方法是什么?

这应该是好的。任何可行的
未来
实现都需要以这样一种方式编写:将其标记为已完成需要一个释放围栏,检查完成需要一个获取围栏。当
将来的
标记为已完成时,应刷新之前对
重类的所有更改,并应确保在任务的完成状态可见时其他线程可见


当然,依靠这一点意味着相信实现执行器的人都知道他们在做什么。如果您使用的是核心Java执行器之一,您应该不会有问题。

关于
Future
的一个好处是您不必担心这个问题。来源:

内存一致性影响:异步计算执行的操作发生在另一个线程中相应Future.get()之后的操作之前

因此,即使您的任务对确保线程间结果的可见性没有任何作用,
Executor
实现也会为您解决这一问题