<强> 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 - - - - - - - - - - -不稳定的关键字浅析