Вопрос 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();
}
}
}