为了账号安全,请及时绑定邮箱和手机立即绑定

Java volatile关键字的问题

Java volatile关键字的问题

蝴蝶刀刀 2018-07-30 06:18:05
//线程1boolean stop = false;while(!stop){doSomething();}//线程2stop = true;这段代码是很典型的一段代码,很多人在中断线程时可能都会采用这种标记办法。但是事实上,这段代码会完全运行正确么?即一定会将线程中断么?不一定,也许在大多数时候,这个代码能够把线程中断,但是也有可能会导致无法中断线程(虽然这个可能性很小,但是只要一旦发生这种情况就会造成死循环了)。下面解释一下这段代码为何有可能导致无法中断线程。在前面已经解释过,每个线程在运行过程中都有自己的工作内存,那么线程1在运行的时候,会将stop变量的值拷贝一份放在自己的工作内存当中。  那么当线程2更改了stop变量的值之后,但是还没来得及写入主存当中,线程2转去做其他事情了,那么线程1由于不知道线程2对stop变量的更改,因此还会一直循环下去。看如上代码和描述,这里为什么会造成死循环,即使线程2更改了stop变量的值之后,但是还没来得及写入主存当中,线程2转去做其他事情了,在我的思路里,线程2也会在做完其他事也会把stop变量的值更新。这样不会有死循环的问题,只是时间快慢的问题。
查看完整描述

1 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

如果没有volatile 做修饰stop = true;,这时其他线程对stop可能不会立马可见,但不代表永远不可见,那只是时间问题,当然这个时间对人来讲肯定很快,微妙级别的或更短

你只要线程2给stop赋了true,不管你再去做啥事线程1都会停止


查看完整回答
反对 回复 2018-08-01
  • 1 回答
  • 0 关注
  • 607 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信