Это связано, но определенно не идентично, с этим знаменитым вопросом SO:
Избегать синхронизации (это) в Java?
Очень часто у меня есть "наблюдаемый субъект", который любит уведомлять своих наблюдателей, когда он изменяется. Уведомление в основном вызывает "чужой метод" (как они называются в Effective Java и т. Д.). У меня может быть что-то вроде этого:
public void updateData(params) {
synchronized (this) {
// do some computation here
}
notifyObservers(); // Never, EVER, call an alien method with a lock held (see Effective Java)
}
public synchronized Result getResult() {
...
}
Должен ли я избегать synchronized(this)
и, следовательно, также удалить synchronized
из getResult()
метода?
Это то, что люди, которые советуют против synchronized(this)
, рекомендуют:
private final Object lock = new Object(); // shiny lock
public void updateDate(params) {
synchronized( lock ) {
...
}
notifyObservers();
}
public Result getResult() {
synchronized( lock ) {
return Result;
}
}
В качестве дополнительного вопроса, который не оправдывает его собственный вопрос SO: если последний рекомендуется, что люди, которые не советуют использовать synchronized (this) , думают о том, что методы в Java могут быть объявлен как "синхронизированный"?