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