Предположим, что у меня есть реализация монитора чтения/записи на 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--;
)
будет ли какая-либо разница в эффективности? или будет считаться небрежным? – ali
@ali - в теории, вероятно, более эффективно выйти из синхронизированного блока как можно скорее после уведомления (т. Е. Уведомление должно быть последним действием). – jtahlborn
@jtahlborn ах ладно спасибо! – ali