Java 这些方法有相同的输出吗?
是的,但是原子原语更有效。值得注意的是,布尔表达式Java 这些方法有相同的输出吗?,java,concurrency,Java,Concurrency,是的,但是原子原语更有效。值得注意的是,布尔表达式 protected synchronized boolean isTimeoutOccured(Duration timeoutDuration) { DateTime now = new DateTime(); if (timeoutOccured == false) { if (new Duration(requestTime.getMillis(), now.getMillis()).compareTo(
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);
}
在第一个示例中位于同步块内,但在第二个示例中位于任何内存屏障之外。(在第二个示例中,表达式的结果作为参数传递给原子compareAndSet调用,但表达式本身的求值发生在任何内存屏障之外。)
因此,答案取决于其他类(Duration、DateTime)的线程安全性。我假设这些是JodaTime类,快速浏览一下javadoc就会发现这些类产生了线程安全和不可变的实例,因此输出应该总是相同的
事实上,考虑到此计算的所有组成部分都是不可变的(DateTime和Duration的所有实例),您应该能够不进行同步或原子比较数据集
new Duration(requestTime.getMillis(), new DateTime().getMillis()).compareTo(timeoutDuration) > 0