Тупик без цикла - PullRequest
       7

Тупик без цикла

0 голосов
/ 01 апреля 2011

Если я рисую график, который символизирует все возможные вызовы функций блокировки (синхронизированные методы Java), и у меня нет цикла в этом графике, могу ли я быть уверен, что взаимоблокировки невозможны. Разве петрицы не работают так?

Я не ищу ответы вроде этого: Используйте какой-нибудь монстр-фреймворк, бла-бла.

Я хочу обработать мою многопоточность синхронизированными методами.

EDIT1: указанные стрелки символизируют, если один класс вызывает какой-либо синхронизированный метод другого класса EDIT2: клик @ здесь пример, показывающий цикл

Ответы [ 3 ]

2 голосов
/ 01 апреля 2011

Нет, этого недостаточно.Предположим, у вас есть потоки: A и B. A вызывает метод m1 объекта o1, который вызывает метод m1 объекта o2.Поток B вызывает метод m2 объекта o2, который вызывает метод m2 объекта o1.Предположим, что все методы синхронизированы.Теперь есть одновременные исполнения A и B, которые приводят к тупикам.Хотя между методами нет отношения циклического вызова.

Это домашнее задание?

Даже если вы изменили класс, этого недостаточно, поскольку вы можете закрыть цикл с помощью вызова не синхронизированного метода.

0 голосов
/ 01 апреля 2011

Нет. Рассмотрим:

private static final Semaphore foo = new Semaphore(1);
private static final Semaphore bar = new Semaphore(1);

private static void one() throws InterruptedException {
    foo.acquire();
    bar.acquire();
    bar.release();
    foo.release();
}

private static void two() throws InterruptedException {
    bar.acquire();
    foo.acquire();
    foo.release();
    bar.release();
}

См. http://pastebin.com/QfK5ZByj для работающего примера. Он довольно быстро блокируется для меня.

0 голосов
/ 01 апреля 2011

Некоторые методы могут блокироваться без ключевого слова synchronized.Это относится ко многим методам в пакете java.util.concurrent, например.Также следует учитывать блоки synchronized внутри методов.

Если рассматривать только синхронизированные методы, вы можете иметь тупиковые блокировки без циклов в вызовах методов, поскольку синхронизированные методы используют экземпляр объекта в качестве монитора.Например, если у вас есть два объекта A и B, каждый с синхронизированными методами 1 () и 2 ().Если A.1 () вызывает B.1 (), а B.2 () вызывает A.2 (), хотя в методах нет цикла, если поток вызывает B.2(), в то же время другие вызовы A.1()тогда существует риск тупиковой ситуации.

...