工作的volatile变量

Pun*_*nit 0 java multithreading volatile

我试图理解volatile变量的工作.我创建了一个简单的类"A",它扩展了"Thread"并具有一个volatile变量"i".还有另一个类"Amain"运行3个"A"类线程.我在A的run()中运行一个循环,它取决于这个volatile变量.这里的代码.

// Thread

public class A extends Thread {

    public volatile int i = 0;

    @Override
    public void run() {

        while(i<10)
            System.out.println(i++ + "  " + this.getName());
    }
}

// Main Class

public class Amain {

    public static void main(String[] args) {

        A t1 = new A();
        A t2 = new A();
        A t3 = new A();

        t1.start();
        t2.start();
        t3.start();
    }

}
Run Code Online (Sandbox Code Playgroud)

如果在所有线程之间共享易失性值,那么"i"应该被打印10次.相反,它为每个线程打印10个值,即总共30个值.需要在此代码的上下文中理解volatile的工作.另外,我还可以从任意数量的线程中获取i的10个值(在此代码的上下文中).

Tag*_*eev 7

在您的情况下,您创建了三个单独的A对象,每个对象都有其单独的i字段,因此这里没有共享状态.如果要共享变量,请将其声明为static:

public static volatile int i = 0;
Run Code Online (Sandbox Code Playgroud)

请注意,即使变量是易变的,增量也是不安全的.请AtomicInteger改用.