return语句是原子的吗?

Li *_*lei 10 java concurrency

我粘贴了一些关于Java并发的代码:

public class ValueLatch <T> {

    @GuardedBy("this") private T value = null;
    private final CountDownLatch done = new CountDownLatch(1);

    public boolean isSet() {
        return (done.getCount() == 0);
    }

    public synchronized void setValue(T newValue) {
        if (!isSet()) {
            value = newValue;
            done.countDown();
        }
    }

    public T getValue() throws InterruptedException {
        done.await();
        synchronized (this) {
            return value;
        }
   }

}
Run Code Online (Sandbox Code Playgroud)

为什么return value;需要同步???

返回语句不是原子的吗?

Mat*_*ans 8

返回不需要同步.由于CountDownLatch.countDown()直到最后一次设置值之后才调用,CountDownLatch.await()因此在读取和返回值之前确保该值是稳定的.

写这篇文章的开发人员可能不太确定他在做什么(并发很困难和危险),或者更可能的是,他使用GuardedBy注释value导致他的构建系统发出警告return,而其他一些开发人员同步它不必要的只是让警告消失.

我说'其他开发人员',因为这个类似乎是专门设计的,getValue()一旦设置了值就允许继续而不锁定.