абсолютно правильно сказать, что все объекты будут строиться последовательно один за другим
Нет.lastRevision.incrementAndGet()
является блокирующим вызовом, но планировщик может приостановить первый поток после получения первого идентификатора, а затем возобновить его после того, как второй поток получит второй идентификатор, что означает, что оба конструктора будут выполняться одновременно.
Другими словами, каждый новый объект имеет метку времени, которая больше предыдущей.
Нет, см. Выше.
как final
ключевое слово влияет на это поведение?
Это не так.
Как я понимаю, если все поля объекта являются окончательными, то это делает конструктор атомарным в некотором роде
Неверно.Если каждое поле является окончательным, тогда класс является неизменным *, что делает его неявно поточно-ориентированным.
Каков наилучший способ создания таких объектов?Достаточно ли сделать lastRevision
атомарным или newInstance
должен быть объявлен синхронизированным?
Если каждый экземпляр должен создаваться последовательно, тогда newInstance
должен синхронизироваться.Как только это так, нет смысла в атомном целом числе.Даже если вы сделаете это, временная метка может оставаться неизменной в зависимости от разрешения системных часов.
* ну, не совсем так.Если каждое поле является окончательным и также является неизменяемым .