Отсутствие тупика при увеличении синхронизированных объектов Integer - PullRequest
0 голосов
/ 28 января 2019

Я пытался реализовать взаимоблокировку в моей программе, и все было в порядке, кроме одной проблемы, которую я не могу объяснить.

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

...

1 Ответ

0 голосов
/ 28 января 2019

balanceA++ эквивалентно balanceA = balance + 1.Он не изменяет Integer (не может, потому что Integer неизменен).Он просто изменяет значение параметра balanceA для ссылки на другой объект.

Если вы используете AtomicInteger и вызываете либо incrementAndGet, либо getAndIncrement, , то you 'Посмотрим, как изменятся значения.Вам также не потребуется синхронизация.

...