gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:31:16 25 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;
}
}

上面的代码我还是不太理解。如果两个线程在 instance 为 null 时一起运行同一行代码,会有什么问题?

if (searchBox == null) {
synchronized (SearchBox.class) {
if (searchBox == null) {
searchBox = new SearchBox();
}
}
}

当那个出现的时候。两个线程都将看到对象为空。然后两者同步。然后,他们再次检查,仍然看到它为空。并创建两个不同的对象。糟糕。

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

谢谢:)

最佳答案

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

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

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

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