gpt4 book ai didi

java - 此同步代码是否会导致不必要的线程等待?

转载 作者:行者123 更新时间:2023-12-01 18:25:06 25 4
gpt4 key购买 nike

我们有一个应用程序,它有一个类,该类保存通过数据库填充的成员。这是这种情况的一个代表性示例。

private AtomicBoolean data1Initialized = new AtomicBoolean(false);
protected SomeSynchronizedDataStructure<Object> data1 = <initializeit>;

protected final synchronized void initData1() {
if (data1Initialized.compareAndSet(false, true)){
// Populate data1 data structure from database
}
}
public SomeSynchronizedDataStructure<Object> getData1(){
initData1();
return data1;
}

对于 data1、data2、data3...dataN,我们有相同的模式。每个数据结构彼此不相关,它们只是在同一个类中。该数据是跨多个线程访问的。关于此模式的几个问题:

同步方法将使线程必须等待所有不同 dataN 之间的 boolean 检查,对吗?哪些是不必要的?

数据结构需要同步吗?数据在应用程序的整个生命周期中不会改变。我认为只有初始化它才需要同步,并且访问可能会不同步。

对我个人来说最重要

这会导致僵局吗?我想不是,但我对线程没有经验。

最佳答案

当您在类创建时进行初始化时,您需要的是:

public class DataHolder {
// Note: 'final' is needed to ensure value is committed to memory before DataHolder
private final SomeSynchronizedDataStructure<Object> data1 = <initializeit>;

public SomeSynchronizedDataStructure<Object> getData1(){
return data1;
}
}

因为“initializeit”代码将在类的构造函数中运行,所以您知道当您有一个可用于传递的类句柄时,它就已经准备好了。例如:

DataHolder dataHolder = new DataHolder();
// dataHolder has already created the data structure by the time I do...
dataHolder.getData1();

如果您确实想要延迟加载,您可以简单地使用同步:

public class DataHolder {
private SomeSynchronizedDataStructure<Object> data1;

public synchronized SomeSynchronizedDataStructure<Object> getData1() {
// synchronized guarantees each thread will see "data1" just as the
// last thread left it.
if(data1 == null) {
data1 = initializeit();
}
return data1;
}
}

关于java - 此同步代码是否会导致不必要的线程等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26490540/

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