单例中的双重检查锁定
这是我的单例模式的自定义类。在此代码中,我使用双重检查锁定,如下所示。当我阅读许多关于某些源代码的帖子时,他们说双重检查很有用,因为它可以防止两个并发线程同时运行,使两个不同的对象。
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;
}
}
我仍然不太理解上面的代码。如果两个线程一起运行同一行代码,而实例为 null,这是什么问题?
if (searchBox == null) {
synchronized (SearchBox.class) {
if (searchBox == null) {
searchBox = new SearchBox();
}
}
}
当它出现时。两个线程都将看到对象为空。然后两者都同步。然后,他们再次检查,仍然看到它为空。并创建两个不同的对象。哎呀。
请为我解释。我看错了什么?
谢谢:)