参考更新线程安全吗?

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关键字?
我想是的.有人可以证实吗?

And*_*yle 6

,这不是线程安全的.(是什么让你觉得它是?)

如果要更新一个线程中的变量并从另一个线程中读取它,则必须在写入和后续读取之间建立先发生关系.

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

没有它,就不能保证阅读线程会看到更新 - 它甚至不会像"好吧,它会看到旧值或新值"那么简单.您的读者线程可能会看到一些非常奇怪的行为,随之而来的是数据损坏.看看缺乏同步会导致无限循环,例如(该文章的评论,特别是Brian Goetz',非常值得一读):

故事的寓意:每当跨线程共享可变数据时,如果你没有正确使用同步(这意味着使用一个公共锁来保护对共享变量的每次访问,读或写),你的程序就会被破坏,并且被打破在你可能甚至无法枚举的方式.