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的值是什么?为什么?
您应该根据Java内存模型推断某些字段值的可见性和排序保证.
我假设你的问题本来是要问"什么保证我有一个值a,b而c其他线程所观察到的?"
在这种情况下,为了从volatile语义中获得好处,您需要volatile在另一个看到特定volatile写入的线程中读取.如果出现这种情况,在volatile读同步,用的是volatile写这之前发生的读取,读线程是保证看到值a和b年龄不超过写在观测值的线程的值c写入.
PS当我说"不老"时,我是非正式的,因为JMM竭尽全力避免所有行动的全球时间排序.如果我们想要正式,我们可以使用同步顺序,并定义"no older",因为volatile在观察到的同步顺序之前,同步顺序中的写入不可见.
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |