深入浅出了解之前原则

  

看Java内存模型Java内存模型(JMM,)时,总有一个困惑。关于线程,主存(内存),工作内存(内存)工作,我都能找到实际映射的硬件:线程可能对应着一个内核线程,主存对应着内存,而工作内存则涵盖了写缓冲区,缓存(缓存),寄存器等一系列为了提高数据存取效率的暂存区域。但是,一提到之前原则,就让人有点“丈二和尚摸不着头脑”。这个涵盖了整个JMM中可见性原则的规则,究竟如何理解,把我个人一些理解记录下来。

  
  

两个操作间具有之前关系,并不意味着前一个操作必须要在后一个操作之前执行.happens-before仅仅要求前一个操作对后一个操作可见。

     

这个说法我先后在好几本书中都看到过。也就是说,之前原则和一般意义上的时间先后是不同的。那究竟是什么呢?一步步来看。

  

  

我们先来看一个理想化的模型:顺序一致性(顺序一致)内存模型。在这个模型里,所有操作按程序的顺序来执行,并且每一个操作都是原子的,且立即对所有线程可见只
  ,深入浅出了解之前原则“> <br/>
  </p>
  <p>这个系统中同一时间只有一个线程能读或写内存。也就是说,这个系统里的每两个指令之间,都严格按执行的先后,具有着之前关系。所有的线程,都能够看到一致的全局指令执行视图。如果将总线1看做是线程和内存之间的通道,那么顺序一致性模型就相当于在所有读/写内存的操作时,锁住总线。</p>
  <p>特别注意一点,顺序一致性模型,不代表多线程没有同步问题,只是每个操作之间不存在同步问题,如果你的操作是多个操作的集合体,照样不能安全工作。图中所示的是常见的自增操作,两个线程都有同样的执行视图:1→2→3→4→5→6。然而,线程一的写结果,依然被线程B所覆盖了。线程读写固然对B线程立即可见,但是由于5/6的写操作对于内存的影响依赖于1/2的读操作,所以对于多线程仍然存在问题。</p>
  <p> <img src=深入浅出了解之前原则