Duplo verificado bloqueio em singleton
aqui é minha classe personalizada para o padrão singleton. neste código, eu uso o bloqueio verificado como abaixo. Como eu leio muitos posts em alguma fonte, eles dizem que checagem dupla é útil porque evita que dois threads simultâneos executados ao mesmo tempo façam dois objetos diferentes.
public class DoubleCheckLocking {
public static class SearchBox {
private static volatile SearchBox searchBox;
// private constructor
private SearchBox() {}
// static method to get instance
public static SearchBox getInstance() {
if (searchBox == null) { // first time lock
synchronized (SearchBox.class) {
if (searchBox == null) { // second time lock
searchBox = new SearchBox();
}
}
}
return searchBox;
}
}
Eu ainda não entendo muito o código acima. Qual é o problema, se dois segmentos juntos executarem a mesma linha de código quando a instância for nula?
if (searchBox == null) {
synchronized (SearchBox.class) {
if (searchBox == null) {
searchBox = new SearchBox();
}
}
}
Quando isso aparecer. ambos os dois segmentos verão objeto é nulo. então ambos sincronizam. e depois,eles verificam novamente, e ainda vêem nulo. e crie dois objetos diferentes. OOOPS.
Por favor, explique para mim. O que eu entendi errado?
Obrigado :)