サイクルでcalculatedValueの最大値を取得しようとしていたので、スレッドセーフにしたかったのです。そこで、AtomicIntegerとMath.maxを使用することにしましたが、操作をアトミックと見なすための解決策が見つかりません。
AtomicInteger value = new AtomicInteger(0);
// Having some cycle here... {
Integer anotherCalculatedValue = ...;
value.set(Math.max(value.get(), anotherCalculatedValue));
}
return value.get()
それに関する問題は、私が2つの操作を行うため、スレッドセーフではないことです。どうすればこれを解決できますか?唯一の方法は使用することsynchronized
です?
Java 8が利用可能な場合は、以下を使用できます。
AtomicInteger value = new AtomicInteger(0);
Integer anotherCalculatedValue = ...;
value.getAndAccumulate(anotherCalculatedValue, Math::max);
仕様からどれが:
指定された関数を現在の値と指定された値に適用した結果で現在の値を原子的に更新し、前の値を返します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加