Да.
Существует и другая важная роль для синхронизированных блоков: когда поток входит в синхронизированный блок, он видит изменения в значениях, внесенных предыдущим потоком, который обращался к этому блоку (или другому блоку, синхронизированному с той же блокировкой).
В основном для многоядерного процессора, каждый поток имеет свой собственный кэш памяти на своем ядре: каждое ядро имеет копии одинаковых переменных, их значения могут быть разными на каждом ядре.
При выполнении синхронизированной операции JVM обеспечивает копирование значений переменных из одного кэша памяти в другой. Затем поток, входящий в синхронизированный блок, видит значения, «обновленные» предыдущим потоком.
Как предполагает mre, Java Concurrency in Practice - хороший справочник, если вы действительно хотите понять многопоточность и изучить лучшие практики.