volatile保证对象的可见性但并不保证对象的原子性,因此不能替代synchronized锁。
每次修改该对象后,会把值写入主内存通知其他线程说,我把线程值改了你们快读一下。
举个例子:
public class Test3 {
private static /*volatile*/ boolean flag = true;
public static void main(String[] args) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"启动");
while (flag){}
System.out.println(Thread.currentThread().getName()+"停止");
},"t1").start();
flag = false;
}
}
该方法可能会一直执行。