volatile 可见性
volatile 关键字:当多个线程进行操作共享数据时,可以保证内存中的数据可见。
相较于 synchronized 是一种较为轻量级的同步策略。volatile修饰的变量在被一个线程修改后,会被强制立即刷新到主存(可见性),其他线程如果有该变量的缓存行,会被设置为无效。
程序:
ThreadDemo线程更改flag为true,在main线程中循环,直到flag为true,打印————,然后结束循环。
程序一直不结束。
原因:JVM会为两个线程分配两个私有缓存区域,两个线程都会从主存内(共享内存)拿到flag,在各自的私有内存里面对变量进行操作,然后刷新到主存。
因为ThreadDemo休眠200毫秒,main线程先执行,然后ThreadDemo再执行。
第一次
if (threadDemo.isFlag()) 判断为false
第二次按理说可以结束循环,但是while循环指令优先级高,导致每次在私有内存中拿到数据,每次拿到的还是原来的数据。
我们可以通过给变量加上volatile关键字,让main线程强制每次去主存中拿变量,解决问题。
程序结束
还没有评论,来说两句吧...