gpt4 book ai didi

java - 线程 : Lazy Initialization vs Static Lazy Initialization

转载 作者:搜寻专家 更新时间:2023-10-30 21:44:43 28 4
gpt4 key购买 nike

我正在观看 Java 内存模型视频演示,作者说与 Lazy Initialization 相比,使用 Static Lazy Initialization 更好,我不清楚他说的是什么想说。

我想接触社区,如果有人能用简单的 Java 代码示例解释 Static Lazy InitializationLazy Initialization 之间的区别,我将不胜感激。

引用:Advanced Programming Topics - Java Memory Model

最佳答案

两个实现都可以是静态的,所以这是第一个误解。该视频中的演示者正在解释如何利用类初始化的线程安全性。

类初始化本质上是线程安全的,如果您可以在类初始化时初始化一个对象,那么对象创建也是线程安全的。

这是一个线程安全的静态初始化对象的例子

public class MySingletonClass{

private MySingletonClass(){

}
public static MySingletonClass getInstance(){
return IntiailizationOnDemandClassholder.instance;
}

private static class IntiailizationOnDemandClassHolder{
private static final MySingletonClass instance = new MySingletonClass();

}

}

这里需要注意的是,在调用 getInstance() 之前,永远不会创建和/或初始化 MySingletonClass 实例变量。同样,由于类初始化是线程安全的,IntiailizationOnDemandClassholderinstance 变量将被安全地加载一次,并且对所有线程可见。

要回答您的编辑取决于您的其他实现类型。如果你想做双重检查锁定你的实例变量需要是易变的。如果您不想要 DCL,那么您将需要每次都同步访问您的变量。下面是两个例子:

public class DCLLazySingleton{
private static volatile DCLLazySingleton instance;

public static DCLLazySingleton getInstace(){
if(instance == null){
synchronized(DCLLazySingleton.class){
if(instance == null)
instance=new DCLLazySingleton();
}
}
return instance;
}

public class ThreadSafeLazySingleton{
private static ThreadSafeLazySingleton instance;

public static ThreadSafeLazySingleton getInstance(){
synchronized(ThreadSafeLazySingleton.class){
if(instance == null){
instance = new ThreadSafeLazySingleton();
}
return instance;
}

}

最后一个例子需要在实例的每个请求上获取锁。第二个示例需要在每次访问时进行 volatile 读取(可能很便宜,取决于 CPU)。

第一个例子不管 CPU 总是会加锁一次。不仅如此,每次读取都是正常的,无需担心线程安全。我个人喜欢我列出的第一个示例。

关于java - 线程 : Lazy Initialization vs Static Lazy Initialization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7420504/

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