AtomicInteger和Math.max

时间:2017-03-31 18:54:32

标签: java thread-safety atomic

我试图在一个循环中获得calculateValue的最大值,我希望它是线程安全的。所以我决定使用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

1 个答案:

答案 0 :(得分:6)

如果Java 8可用,您可以使用:

MyList.Sort(new SemanticComparer());

来自specification的内容:

  

以原子方式使用结果更新当前值     将给定函数应用于当前值和给定值,     返回先前的值。