volatile变量如何与其他字段一起使用?

Ami*_*ati 2 java concurrency multithreading

有一种方法可以按顺序初始化三个变量:

 public class Counter implements Runnable{
     private int a;
     private int b;
     private volatile int c;

    //Other code in class goes here

    private void incrementCounter(int i){
      a=10+i;
      b=11+i;
      c=12+i;
     //some other code
     }

   }
Run Code Online (Sandbox Code Playgroud)

incrementCounter(int i)方法由一个线程调用,在c变量初始化之后,主内存中a,b和c的值是什么?为什么?

Dim*_*rov 5

您应该根据Java内存模型推断某些字段值的可见性和排序保证.

我假设你的问题本来是要问"什么保证我有一个值a,bc其他线程所观察到的?"

在这种情况下,为了从volatile语义中获得好处,您需要volatile在另一个看到特定volatile写入的线程中读取.如果出现这种情况,在volatile同步,用的是volatile写这之前发生的读取,读线程是保证看到值ab年龄不超过写在观测值的线程的值c写入.

PS当我说"不老"时,我是非正式的,因为JMM竭尽全力避免所有行动的全球时间排序.如果我们想要正式,我们可以使用同步顺序,并定义"no older",因为volatile在观察到的同步顺序之前,同步顺序中的写入不可见.