在java中测试volatile变量

时间:2018-04-07 01:17:18

标签: java java-ee data-structures core

我在下面有一个简单的程序来测试volatile变量。根据我在t2运行时编写的程序,它应该选择i的值为3并且永远不应该进入while循环

但它输出 0 1 2 0 1 2 因为它是挥发性的,它不应该只打印0,1,2 ??

public class Test{
     public static void main(String []args) throws InterruptedException{      
          TestVolatile t1 = new TestVolatile();
          t1.start();
          t1.join();
          TestVolatile t2 = new TestVolatile();
          t2.start();  
     }
}

class TestVolatile extends Thread{
    volatile int i = 0;  
    public void run(){
        while(i < 3){
            System.out.println(i);
            i++;
        }
    }   
}

2 个答案:

答案 0 :(得分:0)

您正在创建2个不同的TestVolatile个对象,每个对象都有自己的变量i,并且只能使用它。所以第一个对象递增并输出0,1,2,第二个也是如此。

你需要像这样制作i静态

static volatile int i = 0; 

答案 1 :(得分:0)

由于2个线程正在访问i变量的2个副本,因此您获得了输出。

使i变量静态 -

static volatile int i = 0;

了解更多信息 - https://www.javacodegeeks.com/2018/03/volatile-java-works-example-volatile-keyword-java.html