gpt4 book ai didi

java - Java 中的 volatile 类实例和成员访问

转载 作者:行者123 更新时间:2023-12-02 05:47:14 25 4
gpt4 key购买 nike

我认为我正在做的事情是正确的,但由于如果不这样做,这可能会非常严重,所以我真的很想澄清。

该代码是一个尝试表达观点的示例,对于任何轻微的拼写错误,我们深表歉意。

我有以下类(class)

public class Components
{
public final String mVar1;
public final boolean mVar2;

public Components(String var1, boolean var2)
{
mVar1 = mVar1;
mVar2 = mVar2;
}
}

如果我创建此类的一个 volatile 实例,我相信将此组件的值分配给已创建且在内存中的组件的地址是线程安全的。

public class Storage
{
public static volatile Components sComponents = null;
}

因此,无论我是否在主线程或任何其他线程上设置此变量(其中设置只是将其指向已创建的对象,而不是创建新对象),它都应该是线程安全的,因为 volatile 关键字作用于组件引用,该引用将被更新为指向已经存在的对象。

举个例子

public class ThreadedClass
{
public ThreadedClass()
{
// Create an instance of Components so we have something to copy
mInitialComponents = new Components("My String", false);

// Spin off a thread
create_a_new_thread( threadEntryPoint );
}

// This function is called every frame on the main thread
public void update()
{
// If we have our components, print them out
if (Storage.sComponents != null)
{
print(sComponents.mVar1);
print(sComponents.mVar2);
}
}

private Components mInitialComponents = null;

private void threadEntryPoint()
{
// Just sleep for a bit so update gets called a few times
sleep(3000);

// Set our components
Storage.sComponents = mInitialComponents;
}
}

(在现实世界的代码中,mInitialComponents 是通过同步函数创建和访问的,因此访问原始对象是线程安全的)。

所以,我的问题是,当在主线程或任何其他线程上调用 update 时,一旦将 Storage.sComponents 设置为 threadEntryPoint 中的现有对象,是否只是更新对象引用,因此将保证该对象是每当我们检查 null 时就完成。

或者是否有可能部分或全部内部成员都没有被正确分配。

谢谢

最佳答案

您的更新方法不是线程安全的,可能会引发空指针异常。这可以通过将其更改为来解决:

// This function is called every frame on the main thread
public void update()
{
final Components components = Storage.sComponents;
// If we have our components, print them out
if (components != null)
{
print(components.mVar1);
print(components.mVar2);
}
}

组件中的内部值可以安全使用,因为它们是最终的。这是假设您没有从组件实例的构造函数中泄漏对组件实例的引用。

关于java - Java 中的 volatile 类实例和成员访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23944508/

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