gpt4 book ai didi

java - 原子整数线程安全的条件检查?

转载 作者:行者123 更新时间:2023-12-01 21:39:21 26 4
gpt4 key购买 nike

示例代码

@ApplicationScoped
public class AtomicIntegerSample {

private final AtomicInteger successFullSyncCount = new AtomicInteger(0);
private final AtomicLong overallSyncTimeTaken = new AtomicLong(0);

public void incrementSuccessFullSyncCount() {
this.successFullSyncCount.incrementAndGet();
}


public void addOverallSyncTimeTaken(final Long syncTimeTaken) {
overallSyncTimeTaken.addAndGet(syncTimeTaken);
}
/**
* Can be called by multiple threads
* @return
*/
public long getAverageSuccessfulSyncTimeTaken() {
if (successFullSyncCount.get() == 0) {
return 0;
} else {
return overallSyncTimeTaken.get() / successFullSyncCount.get();
}
}

在方法getAverageSuccessfulSyncTimeTaken()中,有条件检查以避免算术异常。

类ApplicationScoped,该方法可以被多个线程并发调用。

该方法线程安全吗?如果我将代码替换如下,线程安全吗?

 /**
* Can be called by multiple threads
* @return
*/
public long getAverageSuccessfulSyncTimeTaken() {
return overallSyncTimeTaken.get() / successFullSyncCount.get();

}

那么就会抛出算术异常。如何最佳地同步此代码?我的意思是只有 successFullSyncCount.get() == 0

最佳答案

它不会抛出任何异常,但可能返回不正确的结果:

  • 时间和计数分别递增。它们不会在单个原子操作中同时递增
  • 时间和计数是单独读取的,而不是在单个原子操作中同时读取。

因此,您可以很好地在一个线程中读取 100 的时间,然后让另一个线程将计数递增几次,然后读取计数并执行除法。因此,这可能会导致每次同步的平均时间低于实际情况。它可能是一个足够好的近似值,也可能不是。

关于java - 原子整数线程安全的条件检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36634801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com