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)
可能有一个线程设置'值'并立即尝试获取'值'.在这种情况下会发生死锁吗?如果是,那该如何避免呢?
可能有一个线程设置'值'并立即尝试获取'值'.在这种情况下会发生死锁吗?如果是,那该如何避免呢?
除非涉及两个锁,否则它不会是死锁(请参阅死锁定义).然而,你都将有一个竞争条件时,得到的是所谓的,然后设置器调用.例如,两个线程可以getValue()一个接一个地调用value方法,然后返回调用setValue(...)一个接一个.然后第二个setter将覆盖另一个的增量.
getValue()等于1 的调用getValue()等于1setValue(...)增量值为2setValue(...)增量值为2所以答案应该是3,但由于竞争条件,它将是2.
与您的代码继续,你需要有synchronized static void increment()哪些方法呢都在弄,增量,并设置.你需要synchronized因为++不是原子操作.
public synchronized static int increment() {
value++;
}
Run Code Online (Sandbox Code Playgroud)
所有这些都说,你应该考虑使用一个AtomicInteger代替你的增量和内存同步的竞争条件.