Java volatile关键字的问题

//线程1
boolean stop = false;
while(!stop){
doSomething();
}

//线程2
stop = true;

这段代码是很典型的一段代码,很多人在中断线程时可能都会采用这种标记办法。但是事实上,这段代码会完全运行正确么?即一定会将线程中断么?不一定,也许在大多数时候,这个代码能够把线程中断,但是也有可能会导致无法中断线程(虽然这个可能性很小,但是只要一旦发生这种情况就会造成死循环了)。

下面解释一下这段代码为何有可能导致无法中断线程。在前面已经解释过,每个线程在运行过程中都有自己的工作内存,那么线程1在运行的时候,会将stop变量的值拷贝一份放在自己的工作内存当中。

  那么当线程2更改了stop变量的值之后,但是还没来得及写入主存当中,线程2转去做其他事情了,那么线程1由于不知道线程2对stop变量的更改,因此还会一直循环下去。

看如上代码和描述,

这里为什么会造成死循环,即使线程2更改了stop变量的值之后,但是还没来得及写入主存当中,线程2转去做其他事情了,在我的思路里,线程2也会在做完其他事也会把stop变量的值更新。这样不会有死循环的问题,只是时间快慢的问题。


蝴蝶刀刀
浏览 608回答 1
1回答

宝慕林4294392

如果没有volatile 做修饰stop = true;,这时其他线程对stop可能不会立马可见,但不代表永远不可见,那只是时间问题,当然这个时间对人来讲肯定很快,微妙级别的或更短你只要线程2给stop赋了true,不管你再去做啥事线程1都会停止
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java