if (searchBox == null) { //line 1
synchronized (SearchBox.class) { //line 2
if (searchBox == null) { //line 3
//do some stuff //line 4
// do some more stuff //line 5
searchBox = new SearchBox();//line 6
}
}
}
, если поток t1 запускается и выполняется до строки 4, а в строке 5 перед созданием объекта (строка 6) он перешел в состояние ожидания и снял блокировку. Затем поток t2 начинает выполнение, завершает выполнение и создает INSTANCE. Теперь поток t1 снова получил возможность выполнить и начал со строки 6, что привело к созданию нового объекта. не является ли это нарушением синглтона даже в методе двойной блокировки.