递增同步 Integer 对象时没有死锁

No deadlock while incrementing synchronized Integer objects

我试图在我的程序中实现死锁,除了一个我无法解释的问题外,一切正常。

public class Test {
    public static void main(String[] args) throws InterruptedException {
        Integer balanceA = 10000;
        Integer balanceB = 10000;

        Thread t1 = new Thread(() -> {
            while (true) {
                Processor.run(balanceA, balanceB);
            }
        });

        Thread t2 = new Thread(() -> {
            while (true) {
                Processor.run(balanceB, balanceA);
            }
        });

        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}

class Processor {
    public static void run(Integer balanceA, Integer balanceB) {
        synchronized (balanceA) {
            synchronized (balanceB) {
                System.out.println(balanceA++ + "; " + balanceB--);
            }
        }
    }
}

为什么它总是显示与我没有修改整数值相同的结果:

10000; 10000

10000; 10000

...

balanceA++ 等同于 balanceA = balance + 1。它不会修改 Integer(它不能,因为 Integer 是不可变的)。它只是更改 balanceA 参数的值以引用不同的对象。

如果您使用 AtomicInteger 并调用 incrementAndGetgetAndIncrement 然后 您会看到值发生变化。您也不需要任何同步。