Is reference update thread safe?

后端 未结 6 516
野趣味
野趣味 2021-01-26 13:49
public class Test{
   private MyObj myobj = new MyObj(); //it is not volatile


   public class Updater extends Thred{
      myobje = getNewObjFromDb() ; //not am settin         


        
6条回答
  •  遥遥无期
    2021-01-26 13:57

    You may get a stale reference. You may not get an invalid reference. The reference you get is the value of the reference to an object that the variable points to or pointed to or will point to.

    Note that there are no guarantees how much stale the reference may be, but it's still a reference to some object and that object still exists. In other words, writing a reference is atomic (nothing can happen during the write) but not synchronized (it is subject to instruction reordering, thread-local cache et al.).

    If you declare the reference as volatile, you create a synchronization point around the variable. Simply speaking, that means that all cache of the accessing thread is flushed (writes are written and reads are forgotten).

    The only types that don't get atomic reads/writes are long and double because they are larger than 32-bits on 32-bit machines.

提交回复
热议问题