Multithreading 使用非易失性变量来停止thead(来自logback源代码)安全吗?

Multithreading 使用非易失性变量来停止thead(来自logback源代码)安全吗?,multithreading,thread-safety,logback,Multithreading,Thread Safety,Logback,我发现logback源代码使用非易失性变量来停止线程,安全吗?正如我们所知,易失性可以保证可见性,但使用非易失性时,工作线程似乎看不到“started”变量的新值。尽管有时它工作得很好。有人能解释这一点吗 类工作线程扩展{ 公开募捐{ AsyncAppenderBase父级=AsyncAppenderBase.this; appenderatachableimpl aai=parent.aai; //在父级启动时循环 while(parent.isStarted()){ 试一试{ E=paren

我发现logback源代码使用非易失性变量来停止线程,安全吗?正如我们所知,易失性可以保证可见性,但使用非易失性时,工作线程似乎看不到“started”变量的新值。尽管有时它工作得很好。有人能解释这一点吗

类工作线程扩展{
公开募捐{
AsyncAppenderBase父级=AsyncAppenderBase.this;
appenderatachableimpl aai=parent.aai;
//在父级启动时循环
while(parent.isStarted()){
试一试{
E=parent.blockingQueue.take();
aai.附件(e);
}捕获(中断异常ie){
打破
}
}
}
protected boolean start=false;
公共布尔值isStarted(){
返回开始;
}

代码源于
ch.qos.logback.core.AsyncAppenderBase
ch.qos.logback.core.UnsynchronizedAppenderBase
volatile
关键字也用于在线程之间通信内存内容。如果一个变量未在多个线程之间共享,则无需使用volatile关键字

如果查看
AsyncAppenderBase
类中
工作者的声明:

Worker worker = new Worker();

只有一个线程可以从BlockingQueue读取事件。

volatile
关键字也用于在线程之间传递内存内容。如果一个变量未在多个线程之间共享,则无需使用volatile关键字

如果查看
AsyncAppenderBase
类中
工作者的声明:

Worker worker = new Worker();

只有一个线程可以从BlockingQueue读取事件。

AsyncAppenderBase在一个线程中工作,Worker在另一个线程中运行,started是AsyncAppenderBase的一个变量,如果AsyncAppenderBase修改了该变量,则Worker无法看到它。AsyncAppenderBase在一个线程中工作,Worker在另一个线程中运行,started是vAsyncAppenderBase的变量,如果AsyncAppenderBase修改了该变量,则worker无法看到它。