gpt4 book ai didi

java - 在多线程情况下延迟初始化静态变量

转载 作者:太空宇宙 更新时间:2023-11-04 06:23:35 24 4
gpt4 key购买 nike

我正在尝试编写一个实例方法来延迟初始化几个静态变量。我正在初始化的对象是不可变的,并且对象的引用不会被类中的任何其他实例或静态方法更改。我希望初始化代码永远不会执行多次,即使在许多不同的线程中可能有该类的多个实例。初始化需要在实例方法中进行,因为该方法会重写父类(super class)中的方法。我正在使用的方法如下。

private static volatile boolean isPrepared;
private static volatile Object object1;
private static volatile Object object2;
private static volatile Object object3;

@Override
void prepare() {
synchronized (this.getClass()) {
if (isPrepared) { return; }
object1 = expensiveCalculation1();
object2 = expensiveCalculation2();
object3 = expensiveCalculation3();
isPrepared = true;
}
}

我假设由于初始化发生在单个同步块(synchronized block)中,因此实例不可能观察到 isPreparedtrue,除非 object1object2object3 均为非空。我还假设简单地将 prepare() 声明为 synchronized 是行不通的,因为锁只是 this。我的假设正确吗?另外,当您想将多个变量标记为“ volatile ”时,将它们一起初始化是一个好主意,还是应该将它们捆绑在一起到单个不可变类中?

最佳答案

将所有延迟初始化状态捆绑到不可变对象(immutable对象)中通常是首选方法,因为这样您需要的只是一个 volatile 变量,没有同步。如果在初始化过程中另一个线程开始初始化,这种安排会让您面临一些重复的工作,但可以最大限度地减少这种情况的可能性,例如通过向 volatile 写入一个哨兵值来表示“正在进行”状态。

关于java - 在多线程情况下延迟初始化静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27125899/

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