不稳定的关键字浅析

  

<强> 1。挥发性的定义
Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致性地更新,线程应该确保通过排他锁单独获取这个变量. Java语言提供了波动,在某些情况下比锁更加方便。如果一个字段被声明成不稳定的关键字,Java线程内存模型确保所有线程看到这个变量值的一致性。
<强> 2。挥发性的实现原则
1)锁前缀指令会引起处理器缓存写回内存.Lock前缀指令导致在执行指令期间,声言处理器的锁#信号。在多核处理器环境中,锁#信号确保在声言该信号期间,处理器可以独占任何共享内存。
2)一个处理器的缓存写会内存会导致其他处理器的缓存失效。(根据MESI协议)
<强> 3.波动的自身特性(自身角度分析特性)
理解不稳定的特性的一个好方法是把对挥发性变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。如下两个代码示例:
挥发性关键字代码:

  
 <代码>公共类VolatileFeaturesExample {
  
  挥发性长v1=0 l;
  
  公共空集(v2) {
  这一点。v1=v2;
  }
  
  公共长get () {
  返回v1;
  }
  
  公共空间getAndIncrement () {
  v1 + +;
  }
  
  公共静态void main (String [] args) {
  VolatileFeaturesExample v=new VolatileFeaturesExample ();/*新线程(新ThreadSet (v) .start ();
  新线程(新ThreadGet (v) .start (); */最后CountDownLatch CountDownLatch=new CountDownLatch (5000);
  for (int i=0;我& lt;我+ +){5000;
  新线程(新Runnable () {
  @Override
  公共空间run () {
  v.getAndIncrement ();
  countDownLatch.countDown ();
  }
  }).start ();
  }
  尝试{
  countDownLatch.await ();
  System.out.println (v.get ());
  }捕捉(InterruptedException e) {
  e.printStackTrace ();
  }
  }
  
  静态类ThreadGet实现Runnable {
  私人VolatileFeaturesExample v;
  
  公共ThreadGet (VolatileFeaturesExample v) {
  这一点。v=v;
  }
  
  公共空间run () {
  长local_v1=0 l;
  而(local_v1 & lt; 10) {
  如果(local_v1 !=v.get ()) {
  System.out.println (“ThreadGet - - - - - - - - - - - - - - - -”+ v.get ());
  local_v1=v.get ();
  }
  }
  
  }
  
  }
  
  静态类ThreadSet实现Runnable {
  
  私人VolatileFeaturesExample v;
  
  公共ThreadSet (VolatileFeaturesExample v) {
  这一点。v=v;
  }
  
  公共空间run () {
  长local_v1=0 l;
  而(local_v1 & lt;10){
  System.out.println (“ThreadSet - - - - - - - - - - -”+ (+ + local_v1));
  v.set (local_v1);
  尝试{
  thread . sleep (10);
  }捕捉(InterruptedException e) {
  e.printStackTrace ();
  }
  }
  }
  
  }
  } 
  

把挥发性改为锁同步。(这里只贴了方法代码,其它和上面一样)

  
 <代码>长v1=0 l;
  
  公共同步空集(v2) {
  这一点。v1=v2;
  }
  
  公共同步长get () {
  返回v1;
  } 
  

代码分析:
获取和设置方法执行结果
(1)加了动荡的关键字的执行结果

  
 <代码> ThreadSet - - - - - - - - - - - 1
  ThreadGet - - - - - - - - - - - - - - - - 1
  ThreadSet - - - - - - - - - - - 2
  ThreadGet - - - - - - - - - - - - - - - - 2
  ThreadSet - - - - - - - - - - - 3所示
  ThreadGet - - - - - - - - - - - - - - - - 3所示
  ThreadSet - - - - - - - - - - - 4
  ThreadGet - - - - - - - - - - - - - - - - 4
  ThreadSet - - - - - - - - - - - 5所示
  ThreadGet - - - - - - - - - - - - - - - - 5所示
  ThreadSet - - - - - - - - - - - 6所示
  ThreadGet - - - - - - - - - - - - - - - - 6所示
  ThreadSet - - - - - - - - - - - 7所示
  ThreadGet - - - - - - - - - - - - - - - - 7所示
  ThreadSet - - - - - - - - - - - 8所示
  ThreadGet - - - - - - - - - - - - - - - - 8所示
  ThreadSet - - - - - - - - - - - 9所示
  ThreadGet - - - - - - - - - - - - - - - - 9所示
  ThreadSet - - - - - - - - - - - 10
  ThreadGet 10 - - - - - - - - - - - - - - - -  
  

(2)去掉波动执行结果

  
 <代码> ThreadSet - - - - - - - - - - - 1
  ThreadGet - - - - - - - - - - - - - - - - 1
  ThreadSet - - - - - - - - - - - 2
  ThreadSet - - - - - - - - - - - 3所示
  ThreadSet - - - - - - - - - - - 4
  ThreadSet - - - - - - - - - - - 5所示
  ThreadSet - - - - - - - - - - - 6所示
  ThreadSet - - - - - - - - - - - 7所示
  ThreadSet - - - - - - - - - - - 8所示
  ThreadSet - - - - - - - - - - - 9所示
  ThreadSet 10 - - - - - - - - - - - 

不稳定的关键字浅析