多线程volatile的相关问题

package com.wqx.lang;

public class VolatileBoolean extends Thread{
private boolean b = true;

@Override
public void run() {
    while(b){
        System.out.println(b);
    }
    System.out.println("run 结束");
}
public static void main(String[] args) throws InterruptedException {
    VolatileBoolean volatileBoolean = new VolatileBoolean();
    volatileBoolean.start();
    Thread.sleep(1000);
    volatileBoolean.b = false;
    System.out.println("设置 false");
    Thread.sleep(1000);

}

}
为什么线程会被停止,按道理说没有加volatile,线程内存中的b应该还是true才对?
把System.out.println(b);去掉线程又不能够停止,有人能够说明一下为什么会出现这样状况

线程安全呀,用volatile跟类型对应原子类型或者直接用锁

volatile只是阻止寄存器优化,就是每次变量有了变化,都要从主存中去读取新数据,而不是用缓存中的数据。但是你修改了b变量后,另一个线程还是可能读取到更新以后的数据。只是没有volatile那么快。主要是寄存器的优化