gpt4 book ai didi

java - 引用更新线程安全吗?

转载 作者:行者123 更新时间:2023-12-01 07:11:41 26 4
gpt4 key购买 nike

public class Test{
private MyObj myobj = new MyObj(); //it is not volatile


public class Updater extends Thred{
myobje = getNewObjFromDb() ; //not am setting new object
}

public MyObj getData(){
//getting stale date is fine for
return myobj;
}


}

定期更新myobj
其他类使用getData获取数据
如果不使用 volatile 关键字,这段代码线程安全吗?
我想是的。有人可以确认一下吗?

最佳答案

,这不是线程安全的。 (是什么让你这么认为的?)

如果您要在一个线程中更新变量并从另一个线程中读取该变量,则必须建立 happens-before relationship在写入和后续读取之间。

简而言之,这基本上意味着使读取和写入同步(在同一监视器上),或使引用 volatile

如果没有这个,就不能保证读取线程会看到更新 - 它甚至不会像“好吧,它要么看到旧值,要么看到新值”那么简单。您的阅读器线程可能会看到一些非常奇怪的行为以及随之而来的数据损坏。看看怎么样lack of synchronization can cause infinite loops ,例如(对该文章的评论,尤其是 Brian Goetz 的评论,非常值得一读):

The moral of the story: whenever mutable data is shared across threads, if you don’t use synchronization properly (which means using a common lock to guard every access to the shared variables, read or write), your program is broken, and broken in ways you probably can’t even enumerate.

关于java - 引用更新线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13032766/

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