标签:tar str before for app ror 去掉 ola void
如下代码:
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,就有可能发生。
标签:tar str before for app ror 去掉 ola void
原文地址:https://www.cnblogs.com/bobdeng/p/9007481.html