3 回答

TA贡献1820条经验 获得超2个赞
在没有使用同步手段的时候,当主线程对stopRequested作的修改时,不能确定backgroundThread什么时候能看到变量更改。
因为在代码执行时,会将变量从内存加载到寄存器,如果没有同步,如果另外一个线程(A)对变量的更改就无法刷新到另一个线程(B)中,因为B使用的是寄存器中的变量。如果使用了同步机制,比如synchonized,或者volitle,变量的更改就会立即同步,这样访问这个变量的多个线程就能理科看到了。
在这里,
刚开始执行时,backgroundThread将stopRequested从内存读到寄存器
这里没有使用同步手段,当main线程对stopRequested更新时,只是更新到内存,backgroundThread取到的还是寄存器中的值,所以不会停止。

TA贡献2037条经验 获得超6个赞
通过查询资料,确实和楼主说的环境有关系,楼主可以参考:
Does liveness failure that happened in concurrency exist in java 8main
方法结束了,其它非后台线程不会停止运行(我把和junit
的Test
弄混了)

TA贡献1797条经验 获得超4个赞
这段程序刚开始执行的时候是主线程线程先执行的,然后才是backgroundThread执行,由于给stopRequested变量赋值的时候,停了一秒,这个时候backgroundThread线程抢到了执行权,可能是这个原因吧 个人就建议 不对勿喷!!!
添加回答
举报