这个代码的问题就是 子线程里的while一直在循环,所以打印不了子线程里的while结束后的输出语句。那么有人就会问了,主线程不是3秒后已经把flag改为false了么? 子线程拿到flag值,应该结束循环呀。 这个问题就是可见性问题。意思就是主线程修改了某个值,而子线程读不到刚修改完的值。
原因有两点:
1、cpu的高速缓存,导致另一个线程读的时候,从高速缓存里取,没有从主内存中取值。
2、JIT编译时候的指令重排。
Java编程语言的语义允许Java编译器和微处理器进行执行优化,这些优化导致了与其交互的代码不再同步,从而导致看似矛盾的行为
JMM:
可见性问题,还存在于线程的状态中,线程的状态不能被缓存,应该可见。
假如用while(flag)来判断循环 这个flag是共享变量的话,会存在修改了flag后,子线程读不到flag, 而此时如果用isinterrupt来判断循环的话,主线程中打断了子线程的话,子线程可以立即感知到子线程此时的isinterrupt属性是否被修改,也就可以控制while循环,线程间的这个操作是可见的。还有就是线程运行的时候的状态是runnable, 当线程结束后线程的状态是terminated。这个状态对其他线程也是可见的。
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
添加我为好友,拉您入交流群!
请使用微信扫一扫!