8

См. Это answer. В нем говорится:Блокировка на изменяемом объекте - Почему это считается плохой практикой?

Шесть действительно плохих примеров;

...

блокировка на изменяемом поле. например synchronized (object) {object = ...; }

Что случилось с блокировкой на изменяемом поле? Что, если object было объявлено как final, но не было ли неизменным классом?

+1

Я думаю, вы смешиваете изменяемые поля с неизменяемыми классами (класс, который содержит только неизменяемые поля). –

ответ

14

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

synchronized(lock1) { 
    lock1 = new Object(); 
    sharedVariable++; 
} 

Предположите, что 2 потока пытаются ввести этот критический раздел. Входит нить 1, и поток 2 ждет. Тема 1 входит, переназначает lock1 и продолжается. Теперь поток 2 видит другой замок, чем тот, который был получен нить 1, который также свободен, поэтому он также может войти в критический раздел. Забавно!

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

5

«Mutable» - это неправильное слово здесь. Это нормально блокировать изменяемый объект, т. Е. Объект с состоянием. Неправильно блокировать поле, изменять его и ожидать, что другой поток будет заблокирован на одном и том же объекте.

1

Я не думаю, что блокировка изменчивого объекта плоха сама по себе. Просто очень сложно понять это правильно. Существуют и другие модели для параллельной обработки, такие как актеры. Я предлагаю вам изучить Akka, который может быть использован как из Java, так и для Scala, и является очень надежной реализацией.

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