У меня есть догадка, что использование именования держателя без объявления поля держателя как окончательного не является потокобезопасным (из-за того, что неизменяемость работает на Java). Может ли кто-нибудь подтвердить это (надеюсь, с некоторыми источниками)?Инициализация по требованию Держатель идиомы потокобезопасен без окончательного модификатора
public class Something {
private long answer = 1;
private Something() {
answer += 10;
answer += 10;
}
public int getAnswer() {
return answer;
}
private static class LazyHolder {
// notice no final
private static Something INSTANCE = new Something();
}
public static Something getInstance() {
return LazyHolder.INSTANCE;
}
}
EDIT: Я определенно хочу Sourced заявления, а не только утверждения, как «работает» - пожалуйста, объясните/доказать, что это безопасно
EDIT2: Немного изменений, чтобы сделать мой пункт более ясно - я могу быть что метод getAnswer() вернет 21 независимо от вызывающего потока?
Это совершенно нитевидный, окончательный или нет. – Bohemian
Источники для этого утверждения? –
Модель памяти Java - я отвечу ... oops, слишком поздно: @assylias сделала это для меня. – Bohemian