最佳答案
这是我的单例模式定制课程。在这段代码中,我使用了如下双重检查锁定模式。我读过很多关于某些资源的文章,他们说双重检查是有用的,因为它可以防止两个并发线程同时运行,从而产生两个不同的对象。
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;
}
}
我还是不太懂上面的代码。当 instance 为 null 时,如果两个线程一起运行同一行代码,那么问题是什么?
if (searchBox == null) {
synchronized (SearchBox.class) {
if (searchBox == null) {
searchBox = new SearchBox();
}
}
}
当它出现的时候。两个线程都会看到 object 为 null。然后两者同步。然后是 他们再次检查,仍然看到它为空。并创建两个不同的对象。哎呀。
请给我解释一下,我理解错了什么?
谢谢:)