如何使用并发类减少一个字段并在java中原子地增加另一个字段

时间:2017-12-12 05:40:21

标签: java concurrency atomic

我有一台状态机 - 待定并完成 - AtomicLong(线程)。我需要以原子方式递减挂起和递增

private final AtomicLong pending = new AtomicLong();
private final AtomicLong completed = new AtomicLong();

void markComplete() {
  this.pending.decrementAndGet();
  this.completed.incrementAndGet();
}

我可以通过使用块同步来制作这个原子。但这似乎打败了使用并发对象的使用。

synchronized void markComplete() {
  this.pending.decrementAndGet();
  this.completed.incrementAndGet();
}

我想知道是否有更狡猾的方式这样做?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

如果select sum(income),id_cust,to_char(incomedate,'YYYY') year from customertable group by id_cust,to_char(incomedate,'YYYY') pending符合complete范围(只要在您致电int时待处理大于零),您就可以沿着这些行执行某些操作:

markComplete()

答案 1 :(得分:0)

不要更新currentPending,因为它是可派生的。保留它并使用它:

public long getCurrentPending() {
    return currentPending.get() - completed.get();
}

添加项目时,您可以随时增加currentPending而不会破坏任何内容。

答案 2 :(得分:0)

并发对象仅用于使一个值线程安全。如果您希望对多个值具有可靠性,则必须使用锁定(如同步中)