gpt4 book ai didi

java - 单例中的双重检查锁定

转载 作者:行者123 更新时间:2023-12-02 03:59:01 24 4
gpt4 key购买 nike

这是我的单例模式的自定义类。在此代码中,我使用双重检查锁定,如下所示。当我在某些来源上阅读许多帖子时,他们说双重检查很有用,因为它可以防止同时运行的两个并发线程产生两个不同的对象。

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();
}
}
}

当它出现时。两个线程都会看到 object 为 null。然后两者同步。然后,他们再次检查,仍然看到它为空。并创建两个不同的对象。哎呀。

请帮我解释一下。我理解错了什么?

谢谢:)

最佳答案

不,由于您正在获取 SearchBox.class 上的锁,因此一次只有一个线程会进入同步块(synchronized block)。因此第一个线程进入然后发现 searchBox 为 null 并创建它,然后离开同步块(synchronized block),然后第二个线程进入该 block 然后发现 searchBox 不为 null因为第一个线程已经创建了它,所以它不会创建 searchBox 的新实例。

双重检查模式用于避免每次执行代码时都获取锁。如果调用没有同时发生,那么第一个条件将失败,代码执行将不会执行锁定,从而节省资源。

关于java - 单例中的双重检查锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56743379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com