理解volatitle带来的可见性
Posted 邓志国
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解volatitle带来的可见性相关的知识,希望对你有一定的参考价值。
如下代码:
public class VolatileTest { volatile int value1; int value2; public static void main(String[] args) { final VolatileTest main=new VolatileTest(); new Thread(()->{ int value=0; while(true){ value++; main.value2=value;//1 main.value1=value;//2 } }).start(); new Thread(()->{ while(true){ int v1=main.value1;//3 int v2=main.value2;//4 if(v2<v1){ System.out.println(String.format("error v1=%d v2=%d",v1,v2)); } } }).start(); } }
会打印出error吗?(这里有个Bug,先不考虑,就是整数会溢出的情况)
答案是不会,因为value1是volatile的,根据可见性,那么2 happens before 3,所以递推,4 happens before 1。所以v2不可能小于v1。
如果去掉volatile,就有可能发生。
以上是关于理解volatitle带来的可见性的主要内容,如果未能解决你的问题,请参考以下文章