Java面试题之多线程 volatile 变量和 atomic 变量有什么不同?
在Java中,volatile
变量和原子变量(如 AtomicInteger
, AtomicReference
等)都是用于处理多线程环境下的共享变量,但它们的特性和使用场景有所不同。以下是它们之间的主要区别:
volatile:
volatile
关键字用于修饰变量,确保对该变量的写操作对所有线程立即可见。也就是说,当一个线程修改了 volatile
变量的值,其他线程能够立即看到这个修改。volatile
变量的读写操作不会被线程缓存,直接从主内存中读取和写入。原子变量:
AtomicInteger
)不仅保证了内存可见性,还提供了原子性操作。原子性意味着对变量的操作是不可分割的,多个线程同时对原子变量进行操作时,不会出现数据不一致的情况。volatile:
volatile
变量的读写操作是原子的,但复合操作(如 i++
)不是原子的。也就是说,如果多个线程同时对一个 volatile
变量进行复合操作,可能会导致数据不一致。原子变量:
incrementAndGet()
、decrementAndGet()
等,这些操作都是线程安全的,能够保证在多线程环境下的正确性。volatile:
volatile
变量的性能开销相对较小,因为它只涉及到内存可见性,不涉及复杂的锁机制。原子变量:
volatile:
原子变量:
volatile
变量可以确保内存可见性,但不保证操作的原子性。在选择使用 volatile
还是原子变量时,需要根据具体的应用场景和需求来决定。