参考:http://www.cnblogs.com/rocketfan/archive/2009/12/05/1617759.html
volatile:
1.volatile的作用:
(1) the content of a volatile variable is “unstable” (can change by means unknown to the compiler),
(2) all writes to volatile data are “observable” so they must be executed religiously, and
(3) all operations on volatile data are executed in the sequence in which they appear in the source code.
1.被声明为volatile的变量其内容是不稳定的(unstable),它的值有可能由编译器所不能知晓的情况所改变。
2.所有对声明为volatile的变量的写操作都是可见的,必须严格执行be executed religiously。
3.所有对声明为volatile的变量的操作(读写)都必须严格按照源代码的顺序执行。
volatile确保每次直接从内存读取变量的值。java中的volatile是跨线程保证上述三个条件的,而C++只是单一线程内保证。
但是即使是JAVA能够跨越线程保证,仍然是不够的因为volatile和非volatile操作之间的顺序仍然是未定义的,有可能产生问题,考虑下面的代码:
volatile int vi;
void bar(void) {
vi = 1;
foo();
vi = 0;
}
我们一般会认为vi会在调用foo之前设置为1,调用完后会被置为0。然而编译器不会对你保证这一点,它会很高兴的将你的foo()移位,比如跑到vi = 1前面,只要它知道在foo()里不会涉及到其它的volatile操作。所以安全的方法是用栅栏memory barrier例如“asm volatile (”" ::: “memory”)加到foo的前面和后面 来保证严格的执行顺序。内存屏障保证代码执行时严格按照源代码的的顺序。