这些方法有相同的输出吗?

时间:2010-06-17 12:21:04

标签: java concurrency

protected synchronized boolean isTimeoutOccured(Duration timeoutDuration) {
    DateTime now = new DateTime();

    if (timeoutOccured == false) {
        if (new Duration(requestTime.getMillis(), now.getMillis()).compareTo(timeoutDuration) > 0) {
            timeoutOccured = true;
        }
    }

    return timeoutOccured;
}

protected boolean isTimeoutOccured2(Duration timeoutDuration) {

    return atomicTimeOut.compareAndSet(false, new Duration(requestTime.getMillis(), new DateTime().getMillis()).compareTo(timeoutDuration) > 0);

}

2 个答案:

答案 0 :(得分:2)

是的,但原子基元效率更高。

答案 1 :(得分:1)

值得注意的是布尔表达式

new Duration(requestTime.getMillis(), new DateTime().getMillis()).compareTo(timeoutDuration) > 0

位于第一个示例中的同步块内,但在第二个示例中位于任何内存屏障之外。 (在第二个示例中,表达式的结果作为参数传递给原子compareAndSet调用,但表达式本身的评估发生在任何内存屏障之外。)

因此,答案取决于其他类(Duration,DateTime)的线程安全性。我假设这些是JodaTime类,快速浏览一下javadoc表示这些类生成线程安全且不可变的实例,因此输出应始终相同。

事实上,鉴于此计算的所有组成部分都是不可变的(DateTime和Duration的所有实例),您应该能够完全没有同步或原子compareAndSet。