2013-05-02 2 views
0

Предположим, что у меня есть реализация монитора чтения/записи на Java.notifyall() не последнее утверждение

Несколько читателей или один писатель может получить доступ к базе данных в любой момент времени (не оба)

class RWmonitor{ 
    private int readers = 0; 
    private boolean writing = false; 

    public synchronized void StartRead(){ ..} 
    public synchronized void EndRead(){ 
     notifyAll(); 
     readers--; 
    } 

    public synchronized void StartWrite(){ ..} 
    public synchronized void EndWrite(){ 
     notifyAll(); 
     writing = false; 
    } 
} 

Теперь, это важно, если notifyAll() не последнее утверждение в синхронном методе?

Предположим:

1) EndRead() выполняет

2) notifyAll() уведомляет все ожидающие темы

3) Затем он уменьшает количество читателя.

Когда он исполняет notifyAll(), будет ли это просто более дорогостоящим, так как разбуженные потоки будут ждать выхода блокировки на RWmonitor? (при условии, что нить, которая имеет блокировку на RWmonitor, все еще находится на readers--;)

ответ

4

Не имеет значения, является ли это последним утверждением.

процитировать javadoc for notifyAll():

Пробужденные потоки не смогут продолжать, пока текущий поток не освободит блокировку этого объекта.

+0

будет ли какая-либо разница в эффективности? или будет считаться небрежным? – ali

+1

@ali - в теории, вероятно, более эффективно выйти из синхронизированного блока как можно скорее после уведомления (т. Е. Уведомление должно быть последним действием). – jtahlborn

+0

@jtahlborn ах ладно спасибо! – ali

3

Нет, это не имеет значения. Блокировка по-прежнему будет удерживаться до конца блока synchronized, и никакие потоки не смогут wait заблокировать в промежуток времени. На самом деле это немного выгодно, чтобы сначала уведомить об этом, что исключение может остановить обновление, но не уведомление.

+0

ahh .. thats интересно думать, что исключение может остановить обновление. Благодаря! – ali

+0

, но если обновление не произойдет, вам, скорее всего, не потребуется уведомление. – jtahlborn

+0

@jtahlborn Если есть исключения после уведомления, но до обновления, то потоки просыпаются, но обходят их while-loop, что безопасно. (Хотя вы можете потерять выпуск.) –

Смежные вопросы