未来采取的行动"发生之前"未来#isDone调用返回true?

时间:2018-02-27 23:04:04

标签: java synchronization

假设我运行以下功能:

public boolean removeBoat(String boatId) {
    System.out.println(">>> Deleting boat.");
    Boat b = findBoatById(boatId);

    if( b != null ){
       this.dock.getDockedBoats().remove(b);
       return true;
    }

    return false;
}

public Boat findBoatById(String boatId) {
    System.out.println(">>> Find boat from list.");

    for( Boat b : this.dock.getDockedBoats() ){
       if( boatId.equalsIgnoreCase( b.boatId ) ){
          return b;
       } 
    }

    return null;
}

是否保证返回boolean functionWithAsyncTask() { boolean[] b = new boolean[1]; b[0] = false; Future<?> f = executorService.submit(() -> { b[0] = true; return null; }); while (!f.isDone()) { // ... do some other work with no synchronization ... } return b[0]; } (假设它完全返回),或者可能返回true

更抽象地说,我认为这个问题与以下问题相同:false返回Future#isDone建立一个先发生关系,异步线程采取的操作发生在调用{之后的代码之前{1}}?

1 个答案:

答案 0 :(得分:1)

实际上有两个问题,所以我将分别回答:

  

是否保证返回true

没有。只有Future.get()发生前保证。此外,这样的保证不可能存在,因为如果任务被取消或引发异常,isDone()将返回true。

  

可能会返回false吗?

如果正常完成则不行。在标准FutureTask实现中,isDone()检查volatile字段state,该字段通常在任务完成后设置,创建发生在边缘之前。