在Java中进行线程同步,一般使用的是synchronized加锁机制,但是有时候对某些变量可以采用volatile标示达到线程同步的效果。
当把一个变量指明为volatile时,实际上告诉编译器,这个变量是会被多线程访问的。因此编译器将不会做下面两种操作:
1、不会将该变量上的操作与其他内存操作重排序;
2、不会将该变量缓存到寄存器。
这样做的结果导致对该变量的读取和写入这两种操作一定是线程安全的,而且不会像加锁一样阻塞线程,所以比synchronized机制要好。
volatile变量使用时容易出错的地方是:如果对变量的操作是读取、写入和修改的某种组合操作时,比如常见的a++,volatile是无法保证这种组合操作的线程安全性的。这个时候就不能用volatile了,而应该用AtomicXXX变量或者加锁机制了。