5.volatile的应用

  volatilesynchronized,它在多理器开中保了共享量的性的意思是当一个线程修改一个共享,另外一个线程能个修改的如果volatile量修符使用恰当的,它比synchronized的使用和行成本更低,因它不会引起线程上下文的切

 

volatile的定实现原理

  如果一个字段被声明成volatileJava内存模型确保所有线程看到量的是一致的 。

2-1 CPU术语
 

 

  为了提高理速度,理器不直接和内存行通信,而是先将系内存的数据到内部缓存(L1L2或其他)后再行操作,但操作完不知道何会写到内存。如果声明了volatile的变行写操作,JVM就会向理器送一条Lock的指令,将量所在存行的数据写回到系内存。但是,就算写回到内存,如果其他理器存的值还是旧的,再算操作就会有问题。所以,在多理器下,了保各个理器的存是一致的,就会实现缓存一致性协议,每个理器通嗅探在总线播的数据来检查自己存的是不是期了,当处理器发现自己存行对应的内存地址被修改,就会将当前理器的存行置成无效状态,当理器对这个数据行修改操作的候,会重新从系内存中把数据理器存里。


volatile的两条实现:

  1. Lock指令会引起理器存回写到内存Lock指令致在行指令期,声言理器的LOCK#信号。在多理器境中,LOCK#信号确保在声言信号期理器可以独占任何共享内存(锁总线)。 但在P6和目前的理器中,如果访问的内存区域已经缓存在理器内部,不会声言LOCK#信号。相反,它会这块内存区域的存并回写到内存,并使用存一致性机制来确保修改的原子性,此操作被称锁定存一致性机制会阻止同修改由两个以上理器存的内存区域数据 


  2. 一个理器的存回写到内存会致其他理器的存无效 。处理器使用嗅探技它的内部存、系内存和其他理器的缓存的数据在总线上保持一致。嗅探一个理器来检测其他理器打算写内存地址,而个地址当前于共享状,那么正在嗅探的理器将使它的存行无效,在下次访问相同内存地址存行填充
     
volatile的使用化:
 
  volatile锁定的最小资源为缓存行(英特酷睿i7、酷睿、Atom和NetBurst等的L1,L2,L3的缓存行都是64个字节 )避免在同一个缓存行中申明多个volatile变量,因为只要有一个volatile变量的写操作都会导致缓存行被锁定,那么对其它volatile变量的访问都会被阻塞。
 

 

 



  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2017-02-20 17:11  近博  阅读(412)  评论(0编辑  收藏  举报

导航