可能有一个线程设置“值”并立即尝试获取“值”。在这种情况下会发生死锁吗?如果是,那么如何避免呢?
除非涉及两个锁,否则它不会是死锁(参见死锁定义)。但是,当调用 get 然后调用 setter 时,您将遇到竞争条件。例如,两个线程可以一个接一个地调用getValue()
value 方法,然后一个接一个地返回调用setValue(...)
。然后第二个 setter 将覆盖另一个 setter 的增量。
- thread-a 调用
getValue()
等于 1
- thread-b 调用
getValue()
等于 1
- thread-a 增加值
- thread-a 调用
setValue(...)
,增量值为 2
- thread-b 增加值
setValue(...)
增量值为 2 的线程 b 调用
所以答案应该是 3,但由于竞争条件,它将是 2。
继续您的代码,您需要有一个synchronized static void increment()
方法可以同时执行 get、increment 和 set。你需要是synchronized
因为++
不是原子操作。
public synchronized static int increment() {
value++;
}
综上所述,您应该考虑使用一种AtomicInteger
替代方法,它可以为您处理增量和内存同步的竞争条件。