Этот поток довольно единодушен в том, что класс не является потокобезопасным из-за проблем с видимостью.
Почему вы говорите, что класс не является неизменным? Состояние класса определяется параметрами foo и bar, которые для любых конкретных экземпляров не могут быть изменены извне класса после создания экземпляра. Так что он неизменен, даже если поля явно не объявлены как окончательные.
Единственное место, где изменяются foo и bar (в методах foo () и bar ()), изменения вносятся в локальную переменную, которая по определению доступна только одному потоку за раз.
EDIT
Я думаю, что это пример ограничения стека, как определено в Java Concurrency in Practice (3.3.2), который делает методы foo () и bar () потокобезопасными, потому что clone
не разрешается экранировать метод раньше будучи полностью построенным.
Локальные переменные по сути ограничены исполняющей триадой; они существуют в стеке исполняющего потока, который недоступен другим потокам.