并发-可见性
变量的可见性分析
关键字:可见性案例验证、volatile、Unsafe中loadForce方法实现读屏障
可见性保证:
同步
volatile
魔术类内存屏障
内存屏障说明
loadForce实现volatile读(缓存数据置为无效、重新从主存加载)
storeForce实现volatile写(数据立即写入主存,通知其他CPU更新缓存)
指令重排说明
第一个变量是volatile读,禁止后一个变量读写重排序
第二个变量是volatile写,禁止和第一个变量读写重排序
第一个变量是volatile写、第二个是volatile读,两个变量不能冲排序
public class VolatileExample {
public /*volatile*/ boolean isBreak;
public boolean getBreak() {
return isBreak;
}
public void toBreak() {
isBreak = true;
System.out.println("中断标志位isBreak:" + isBreak);
}
/**
* 业务处理线程
*/
public class LoopThread extends Thread {
@Override
public void run() {
System.out.println("开始处理业务,当isShutdown置为false停止");
unsafe().loadFence();
while (!isBreak) {
unsafe().loadFence();
}
;
System.out.println("处理业务结束");
}
}
/**
* 中断线程
*/
public class BreakThread extends Thread {
@Override
public void run() {
toBreak();
}
}
public static void main(String[] args) {
try {
VolatileExample example = new VolatileExample();
example.new LoopThread().start();
Thread.sleep(1000);
example.new BreakThread().start();
Thread.sleep(1000);
System.out.println("中断标志位:" + example.getBreak());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static Unsafe unsafe() {
try {
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
return (Unsafe) theUnsafe.get(null);
} catch (Exception e){
throw new RuntimeException(e);
}
}
}

浙公网安备 33010602011771号