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()
的定期调用)是可见的吗?(注意:连接变量不易变。)
答案 0 :(得分:2)
您的connected
变量不是volatile
,这意味着,在其他线程执行任何写入操作后,所有其他线程都不会guarantee
获得更新的值。因此,我建议您使用volatile
作为用例。 volatile关键字确保所有线程都能看到most recent updated
值。
<强>编辑:强>
非易失性变量也可以在不同条件下刷新CPU缓存。
线程也可以从CPU中交换出来,迫使它在下一次切片时重新加载高速缓存。
一个线程在退出/结束时刷新所有更新的值。如果你在线程之后创建一个新线程(调用doAction
)(称为setConnected
方法)并且它成功完成它将获得更新的值,因为新线程每次都会为它创建一个新的上下文。