syschronized getter和setter但需要避免死锁

use*_*441 0 java multithreading

我有同步静态getter和setter,如:

public synchronized static int getValue() {
    return value;
}

public synchronized static void setValue(int Val) {
    value = Val;
}
Run Code Online (Sandbox Code Playgroud)

如果我需要增加值,我将使用类似的东西

setValue(getValue() + 1);
Run Code Online (Sandbox Code Playgroud)

可能有一个线程设置'值'并立即尝试获取'值'.在这种情况下会发生死锁吗?如果是,那该如何避免呢?

Gra*_*ray 5

可能有一个线程设置'值'并立即尝试获取'值'.在这种情况下会发生死锁吗?如果是,那该如何避免呢?

除非涉及两个锁,否则它不会是死锁(请参阅死锁定义).然而,你将有一个竞争条件时,得到的是所谓的,然后设置器调用.例如,两个线程可以getValue()一个接一个地调用value方法,然后返回调用setValue(...)一个接一个.然后第二个setter将覆盖另一个的增量.

  1. thread-a getValue()等于1 的调用
  2. thread-b调用getValue()等于1
  3. thread-a递增值
  4. thread-a调用setValue(...)增量值为2
  5. thread-b递增该值
  6. thread-b调用setValue(...)增量值为2

所以答案应该是3,但由于竞争条件,它将是2.

与您的代码继续,你需要有synchronized static void increment()哪些方法呢在弄,增量,并设置.你需要synchronized因为++不是原子操作.

public synchronized static int increment() {
    value++;
}
Run Code Online (Sandbox Code Playgroud)

所有这些都说,你应该考虑使用一个AtomicInteger代替你的增量和内存同步的竞争条件.