作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是单例设计模式实现之一: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/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!