- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我是一名优秀的程序员,十分优秀!