Мутирование объекта блокировки - PullRequest
1 голос
/ 15 сентября 2009

Просто любопытно узнать (как можно более подробно), почему это плохая практика изменить объект, используя его в качестве блокировки.

//Assuming the lockObject is globally available
    synchronized(lockObject){
        lockObject.someMutativeOperation(...);
    }

Приветствия

Ответы [ 3 ]

4 голосов
/ 15 сентября 2009

Я не знаю, слышал ли я это утверждение. Конечно, было бы плохо переназначить lockObject (потому что тогда вы бы заблокировали другой объект в другом месте), но я не вижу ничего плохого в его мутировании.

Кроме того, довольно распространенным является метод synchronized, который мутирует объект:

public synchronized void setSomething(int something) {
    this.something = something;
}

В этом случае сам объект используется в качестве блокировки. Какой смысл в синхронизации на отдельном объекте?

3 голосов
/ 15 сентября 2009

Это неплохая практика, вот хорошая практика. Где вы слышали иначе?

Если вы используете примитивную синхронизацию, вы синхронизируете объект (или другую блокировку) перед его изменением.

Хотя это зависит от объема объекта. Если объект находится за пределами вашего класса, вы должны использовать другой механизм синхронизации

2 голосов
/ 15 сентября 2009

Я предполагаю, что вы слышали о мутировавшей ссылке:

synchronized (thing) {
    ...
    thing = newThing;
    ...
}

Обычно это указывает на ошибку. Вероятно, он должен был заблокировать, используя ссылку, которая не меняется. Я думаю, что именно Bitter Java имела такую ​​ошибку в блокировке чтения-записи (блокировка чтения-записи в библиотеке Java существовала в течение пяти лет, поэтому конкретная реализация больше не нужна).

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