原子整数和 Math.max
AtomicInteger and Math.max
我试图在一个循环中获取 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()
问题在于我进行了两次操作,因此不是线程安全的。我该如何解决这个问题?唯一的方法是使用synchronized
?
如果 Java 8 可用,您可以使用:
AtomicInteger value = new AtomicInteger(0);
Integer anotherCalculatedValue = ...;
value.getAndAccumulate(anotherCalculatedValue, Math::max);
specification 中的哪个将:
Atomically updates the current value with the results of
applying the given function to the current and given values,
returning the previous value.
我试图在一个循环中获取 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()
问题在于我进行了两次操作,因此不是线程安全的。我该如何解决这个问题?唯一的方法是使用synchronized
?
如果 Java 8 可用,您可以使用:
AtomicInteger value = new AtomicInteger(0);
Integer anotherCalculatedValue = ...;
value.getAndAccumulate(anotherCalculatedValue, Math::max);
specification 中的哪个将:
Atomically updates the current value with the results of applying the given function to the current and given values, returning the previous value.