![](https://img.haomeiwen.com/i13725626/c149ed1649ba0af2.png)
正常来说,我们都认为把flag字段添加volatile,线程就可以正常退出
实验发现,结果并不像我们所想的那样
注释掉1和2,线程不会退出,写上1或者2时候,线程是可以退出的
什么原因呢?
VM针对现在的硬件水平已经做了很大程度的优化,基本上很大程度的保障了工作内存和主内存的及时同步,相当于默认使用了volatile。但只是最大程度!在CPU资源一直被占用的时候,工作内存与主内存中间的同步,也就是变量的可见性就会不那么及时!
由于jvm的自我优化,jvm中的线程在频繁的使用线程栈中的变量时,线程会对对象做use操作,不频繁使用时,做read-load-use操作
根据上面的说法,sleep让出CPU执行时间,并不会释放锁,所以在让出CPU的时候会同步(也就是read-load-use);
sychronized:java规定在对一个对象进行lock操作时,要清空工作内存,在执行引擎执行前,从主存写到工作内存,所以这个时候拿到的是最新的值
println方法是sychronized的
网友评论