如何同步BigDecimal.add?

我意识到下面的代码不是线程安全的...

BigDecimal foo = new BigDecimal(0.0);

BigDecimal bar = new BigDecimal(10.00);

foo = foo.add(bar)

如果我将代码更新为此:

BigDecimal foo = new BigDecimal(0.0);

BigDecimal bar = new BigDecimal(10.00);

synchronized (this) {
foo = foo.add(bar)
}

这会使代码线程安全吗?很抱歉这个愚蠢的问题

pangdudu945 回答:如何同步BigDecimal.add?

要使这样的操作原子化,可以使用AtomicReference

AtomicReference<BigDecimal> foo = new AtomicReference<>(new BigDecimal(10.0));

...
foo.accumulateAndGet(bar,(f,b) -> f.add(b));

但这基本上与同步this上的块相同:

synchronized (this) {
    foo = foo.add(bar);
}
本文链接:https://www.f2er.com/2894611.html

大家都在问