use*_*796 0 java multithreading thread-safety
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;
}
}
Run Code Online (Sandbox Code Playgroud)
更新定期更新myobj
其他类使用getData获取数据
IS此代码线程安全而不使用volatile关键字?
我想是的.有人可以证实吗?
不,这不是线程安全的.(是什么让你觉得它是?)
如果要更新一个线程中的变量并从另一个线程中读取它,则必须在写入和后续读取之间建立先发生关系.
简而言之,这基本上意味着同时进行读取和写入synchronized(在同一监视器上)或进行引用volatile.
没有它,就不能保证阅读线程会看到更新 - 它甚至不会像"好吧,它会看到旧值或新值"那么简单.您的读者线程可能会看到一些非常奇怪的行为,随之而来的是数据损坏.看看缺乏同步会导致无限循环,例如(该文章的评论,特别是Brian Goetz',非常值得一读):
故事的寓意:每当跨线程共享可变数据时,如果你没有正确使用同步(这意味着使用一个公共锁来保护对共享变量的每次访问,读或写),你的程序就会被破坏,并且被打破在你可能甚至无法枚举的方式.