gpt4 book ai didi

java - 如果我将变量复制到另一个变量并尝试更改它,是否会使变量 volatile 起作用?

转载 作者:太空狗 更新时间:2023-10-29 13:21:30 24 4
gpt4 key购买 nike

我有一个 android Application 对象(尽管我认为这纯粹是一个 java 问题)如下

我想了解我使用 volatile 的方式是否正确,我在 Application 中将 appData 定义为 volatile,这是否会自动保证 AppData 对象中的所有变量(它们中的每一个都是复杂的对象,例如 arrays 等本身)也是不稳定的,或者我是否需要像我所做的那样明确地使它们不稳定

此外,正如我在标记为问题的评论中提到的,将新变量 X 等同于易变变量是否也会使 X 易变?

public class App extends Application{
private volatile static AppData appData;

public void fetchMePageInfo(long idOfUserIfNotForSelf) {

RestService.getMePageInfo(new Callback<MePageInfo>() { // RestService is just another class that calls Web server, and has static method getMepageInfo

@Override
public void success(MePageInfo newMePageInfo, Response response) {
// for successful server request, store the newly fetched me page in array
// and set ref to both self me page ref = me page to be displayed = new object,

ArrayList<MePageInfo> mPageInfoList = appData.getMePageInfoList();
// QUESTION : AppData is volatile, but does that mean mPageInfoList is also threadsafe?

MePageInfo selfRef = appData.getUserMePageInfo();
if (selfRef != null) {
// if me page exists already, additionally remove the existing me page first
mPageInfoList.remove(selfRef);
}
mPageInfoList.add(newMePageInfo);

appData.setUserMePageInfo(newMePageInfo); // does not automatically call change listeners

}


});
}




}


public class AppData {

/**
this has the MePageInfo objects of the various other users that the logged in user might go to
for quick fetch, instead of calling server each time
**/
volatile ArrayList<MePageInfo> mePageInfoList = new ArrayList<MePageInfo>();

// region self Me page info data
/**
* the MePageInfo for the logged in user, this is null initially and is filled by FetchGenericMePageInfo for the user
*/

volatile MePageInfo userMePageInfo = null;

}

最佳答案

volatile 和线程安全不是一回事。 volatile 向您保证

  1. 写入 volatile 变量并随后读取此变量会在两个线程之间建立 happens-before 关系。

  2. 这个特定变量的所有读写都是原子的。

这就是它所做的全部。因此,如果您将一个 volatile 变量的值赋给另一个变量,它不会使其成为 volatile。线程安全的概念更为复杂,变量 volatile 的事实并不意味着即使该变量本身也是线程安全的。

关于java - 如果我将变量复制到另一个变量并尝试更改它,是否会使变量 volatile 起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28095726/

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