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

被折叠的 条评论
为什么被折叠?



