gpt4 book ai didi

java - 为什么饥饿单例模式是线程安全的

转载 作者:行者123 更新时间:2023-11-30 06:14:35 25 4
gpt4 key购买 nike

这是单例设计模式实现之一:Hungry 实现。

我了解到这种方式既可以只创建一个实例,又可以保证线程安全。

很容易理解,只有一个实例,因为实例仅在类加载期间创建。

但是这怎么可能是线程安全的呢?在线文档说这也是因为实例是在加载类时创建的。但我不明白,这个实例如何在多线程情况下保持同步?这对我来说很模糊。谁能解答一下,先谢谢了。

  public class Hunger {
private static Hunger instance = new Hunger();

private Hunger() {}

public static Hunger getInstance() {
return instance; //When multi threads call this, there maybe a problem since only instance is provided.
}
}

最佳答案

为了确保线程安全地初始化单例,您可以使用一种特殊的类,称为枚举。例如:

enum Hungry{
INSTANCE;
private static Random rd;

static {
rd = new Random();
System.out.println("Initializing object...");
}
public Integer nextNum() {
return new Random().nextInt(10);
}

}

public class LazyEval {

public static void main(String[] args) throws InterruptedException {
System.out.println("Start...");

Thread.sleep(1000);
System.out.println("First call");
System.out.println(Hungry.INSTANCE.nextNum());
Thread.sleep(1000);
System.out.println("Second Call");
System.out.println(Hungry.INSTANCE.nextNum());

}
}

您将得到如下输出:

Start... 
First call
Initializing object...
6
Second Call 0

这是因为,当您第一次访问 INSTANCE 时,您的 JVM 将初始化静态 block 上的所有字段。通过这种方式,您可以归档实时延迟初始化并避免竞争条件。

关于java - 为什么饥饿单例模式是线程安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49504574/

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