扫码关注官方订阅号
在没有使用同步手段的时候,当主线程对stopRequested作的修改时,不能确定backgroundThread什么时候能看到变量更改。因为在代码执行时,会将变量从内存加载到寄存器,如果没有同步,如果另外一个线程(A)对变量的更改就无法刷新到另一个线程(B)中,因为B使用的是寄存器中的变量。如果使用了同步机制,比如synchonized,或者volitle,变量的更改就会立即同步,这样访问这个变量的多个线程就能理科看到了。在这里,刚开始执行时,backgroundThread将stopRequested从内存读到寄存器这里没有使用同步手段,当main线程对stopRequested更新时,只是更新到内存,backgroundThread取到的还是寄存器中的值,所以不会停止。
通过查询资料,确实和楼主说的环境有关系,楼主可以参考:Does liveness failure that happened in concurrency exist in java 8
main方法结束了,其它非后台线程不会停止运行(我把和junit的Test弄混了)
main
junit
Test
这段程序刚开始执行的时候是主线程线程先执行的,然后才是backgroundThread执行,由于给stopRequested变量赋值的时候,停了一秒,这个时候backgroundThread线程抢到了执行权,可能是这个原因吧 个人就建议 不对勿喷!!!
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
在没有使用同步手段的时候,当主线程对stopRequested作的修改时,不能确定backgroundThread什么时候能看到变量更改。
因为在代码执行时,会将变量从内存加载到寄存器,如果没有同步,如果另外一个线程(A)对变量的更改就无法刷新到另一个线程(B)中,因为B使用的是寄存器中的变量。如果使用了同步机制,比如synchonized,或者volitle,变量的更改就会立即同步,这样访问这个变量的多个线程就能理科看到了。
在这里,
刚开始执行时,backgroundThread将stopRequested从内存读到寄存器
这里没有使用同步手段,当main线程对stopRequested更新时,只是更新到内存,backgroundThread取到的还是寄存器中的值,所以不会停止。
通过查询资料,确实和楼主说的环境有关系,楼主可以参考:
Does liveness failure that happened in concurrency exist in java 8
main方法结束了,其它非后台线程不会停止运行(我把和junit的Test弄混了)这段程序刚开始执行的时候是主线程线程先执行的,然后才是backgroundThread执行,由于给stopRequested变量赋值的时候,停了一秒,这个时候backgroundThread线程抢到了执行权,可能是这个原因吧 个人就建议 不对勿喷!!!