【发布时间】:2011-02-07 08:49:34
【问题描述】:
基于
volatile 有什么作用? http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#incorrectlySync
和
volatile 的新保证 http://www.ibm.com/developerworks/library/j-jtp03304/
class VolatileExample {
int x = 0;
volatile boolean v = false;
public void writer() {
x = 42;
v = true;
}
public void reader() {
if (v == true) {
//uses x - guaranteed to see 42.
}
}
}
好像是这样。
1a) write to non-volatile variable x
1b) write to volatile variable v
1a 永远无法通过 1b
我想知道,如果我将源代码修改为以下内容
class VolatileExample {
int x = 42;
volatile boolean v = true;
public void writer() {
v = false;
x = 0;
}
public void reader() {
if (v == true) {
//uses x - guaranteed to see 42?????
}
}
}
下面的序列可以置换吗?
2a) write to volatile variable v
2b) write to non-volatile variable x
我想知道,2b 可以在 2a 之前移动吗?这是因为如果 2b 能够在 2a 之前移动,读者就不能再保证在 if 块中看到 42。
根据以下信息,我觉得 2b 可以在 2a 之前移动。
http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#reordering
写入 volatile 字段具有 和显示器一样的记忆效应 释放,并从易失性中读取 场具有相同的记忆效应 监控获取。
这意味着任何内存操作 之前对线程可见 退出同步块是 进入后对任何线程可见 受保护的同步块 同一台显示器,因为所有的内存 操作发生在发布之前, 并且释放发生在 获取。
和Roach Motels and The Java Memory Model
volatile_v = true; <-- monitor release
non_volatile_x = 42;
(volatile_v will act as a roach motels, and it is fine for non_volatile_x to move into roach motels)
non_volatile_x = 42;
volatile_v = true; <-- monitor release
(volatile_v will act as a roach motels, and it is not OK for non_volatile_x to move out from roach motels)
【问题讨论】:
标签: java multithreading