并发-可见性
变量的可见性分析
关键字:可见性案例验证、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); } } }