Это плохая идея, потому что если другой поток изменяет ссылку в критическом разделе, потоки больше не будут видеть одну и ту же ссылку, и поэтому они не будут синхронизироваться на одном и том же объекте, тем самым бегая неконтролируемым. Пример:
synchronized(lock1) {
lock1 = new Object();
sharedVariable++;
}
Предположите, что 2 потока пытаются ввести этот критический раздел. Входит нить 1, и поток 2 ждет. Тема 1 входит, переназначает lock1
и продолжается. Теперь поток 2 видит другой замок, чем тот, который был получен нить 1, который также свободен, поэтому он также может войти в критический раздел. Забавно!
Если объект final
, вы не можете переназначить ссылку на другой объект, поэтому вышеуказанная проблема больше не применяется.
Я думаю, вы смешиваете изменяемые поля с неизменяемыми классами (класс, который содержит только неизменяемые поля). –