从缓存入门到并发编程三要素详解 Java中 volatile 、final 等关键字解析案例( 三 )


  • 它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成
  • 它会强制将对缓存的修改操作立即写入主存
  • 如果是写操作,它会导致其他CPU中对应的缓存行无效
  • volatile修饰之后的变量会加入读写屏障
    • 写屏障(sfence):保证在该屏障之前的,对共享变量的改动 , 都同步到主存当中
    • 读屏障(lfence):保证在该屏障之后的, 对共享变量的读?。釉氐氖侵鞔嬷械淖钚率?
    • 对 volatile 变量的写指令后会加入写屏障
    • 对 volatile 变量的读指令前会加入读屏障
  • 关于volatile 的用途像两阶段终止、单例双重锁等等:
    两阶段终止--volatile
    @Logpublic class TwoPhaseStop {// 监控线程private Thread monitorThread;// 多线程共享变量 单线程写入(停止线程) 多线程读取 使用 volatileprivate volatile boolean stop = false;// 启动监控线程public void start() {monitorThread = new Thread(() -> {log.info("开始监控");while (true) {log.info("监控中");Thread currentThread = Thread.currentThread();if (stop) {log.info("正在停止");break;}try {log.info("正常运行");Thread.sleep(5000);} catch (InterruptedException e) {// sleep出现被打断异常后、被打断后会清除打断标记// 需要重新打断标记currentThread.interrupt();}}log.info("已停止");},"monitor");monitorThread.start();}// 停止监控线程public void stop() {stop = true;monitorThread.interrupt();}}····
    下篇预告:synchronized 和 volatile 区别和底层原理

    推荐阅读