Семантическая эквивалентность синхронизированного метода и семафора (1, правда)? - PullRequest
2 голосов
/ 04 октября 2011

Следующие два определения метода семантически эквивалентны? Зачем? Почему нет?

Версия A:

private static synchronized void foo() {
    bar();
}

Версия B:

private static Semaphore available = new Semaphore(1, true);
private static void foo() {
    available.acquire();
    try {
        bar();
    }
    finally {
       available.release();
    }
}

Ответы [ 2 ]

5 голосов
/ 04 октября 2011

Да, кроме

  • что первый синхронизируется в классе, и что могут быть другие части кода, которые синхронизируются в том же классе.
  • что семафор может быть честным, тогда как синхронизация не
  • что поток, заблокированный в semaphore.acquire, может быть прерван, что вызовет исключение InterruptedException. Ваш код не компилируется как есть: вы должны как-то обработать это исключение, тогда как вам не нужно использовать синхронизированный.
3 голосов
/ 04 октября 2011

Я бы сказал, нет - блок Java synchronized не гарантирует сохранение порядка, то есть это не справедливо.

new Semaphore(1, true) справедливо (true аргумент).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...