Какой будет результат компиляции и выполнения следующего кода?

public class Test {
    private static class Resource {
        public int value;
    };

    private Resource resourceA = new Resource();
    private Resource resourceB = new Resource();

    public int read() {
        synchronized (resourceA) {
            synchronized (resourceB) {
                return resourceA.value + resourceB.value;
            }
        }
    }

    public void write(int a, int b) {
        synchronized (resourceB) {
            synchronized (resourceA) {
                resourceA.value = a;
                resourceB.value = b;
            }
        }
    }

    public static void main(String[] args) {
        final Test test = new Test();

        Runnable targetA = new Runnable() {
            public void run() {
                while (true) 
                    System.out.println(test.read());
            }
        };

        Runnable targetB = new Runnable() {
            public void run() {
                while (true) 
                    test.write(1, 2);
            }
        };

        new Thread(targetA).start();
        new Thread(targetB).start();
    }
}
Explanation
Рано или поздно работа планировщика потоков приведет к тому, что поток threadA овладеет объектом блокировки (object lock) resourceA (или resourceB), а поток threadB -- объектом блокировки resourceB (или resourceA). Т.о., оба потока войдут в блокированное состояние и будут бесконечно ждать освобождения необходимых им объектов блокировки. Т.е., войдут в тупиковое состояние (deadlock).

Следи за CodeGalaxy

Мобильное приложение Beta

Get it on Google Play
Обратная Связь
Продолжайте изучать
тесты по Java
Cosmo
Зарегистрируйся сейчас
или Подпишись на будущие тесты