Вопрос 1: Почему в одноэлементном шаблоне для многопоточности нам нужны две нулевые проверки? Что, если мы воспользуемся только внешним чеком?
if (instance == null) {
synchronized (ABC.class) {
// What if we remove this check?
if (instance == null) {
instance = new ABC();
}
}
Вопрос 2: В чем разница между следующим:
1: Прямое использование имени класса внутри synchronized ()
public ABC getInstance() {
if (instance == null) {
// Difference here
synchronized (ABC.class) {
if (instance == null) {
instance = new ABC();
}
}
}
return instance;
}
2: Использование статического конечного объекта внутри synchronized ()
private static final Object LOCK = new Object();
.
.
public ABC getInstance() {
if (instance == null) {
// Difference here
synchronized (LOCK) {
if (instance == null) {
instance = new ABC();
}
}
}
return instance;
}
3. Использование new Object () внутри synchronized ()
if (instance == null) {
// Difference here
synchronized (new Object()) {
if (instance == null) {
instance = new ABC();
}
}
}