线程,对象状态

时间:2018-04-11 06:24:05

标签: java multithreading object thread-safety java-threads

Class A{

private boolean connected = false;

public void doAction(){

if(connected){
//do something
}
else{
//do this
  }
   }

public void setConnected(boolean flag)
    {
       this.connected = flag;
    }
  }

我的项目中有上面的代码,它是一个单例。 setConnected()方法将在某些条件下触发(它只会被触发一次)。 调度程序定期调用doAction()方法来执行某些操作。

我的问题是,如果在构造之后修改单例对象的状态(通过调用setConnected()),更新状态对于进一步调用方法调用(doAction()的定期调用)是可见的吗?(注意:连接变量不易变。)

1 个答案:

答案 0 :(得分:2)

您的connected变量不是volatile,这意味着,在其他线程执行任何写入操作后,所有其他线程都不会guarantee获得更新的值。因此,我建议您使用volatile作为用例。 volatile关键字确保所有线程都能看到most recent updated值。

<强>编辑:

非易失性变量也可以在不同条件下刷新CPU缓存。

  1. 线程也可以从CPU中交换出来,迫使它在下一次切片时重新加载高速缓存。

  2. 一个线程在退出/结束时刷新所有更新的值。如果你在线程之后创建一个新线程(调用doAction)(称为setConnected方法)并且它成功完成它将获得更新的值,因为新线程每次都会为它创建一个新的上下文。