Java语言中的volatile变量可以被看成一种“轻程度的synchronized”,与synchronized相比,volatile变量所需要的编码较少,并且运行时开销也较少,它所实现的功能也只是synchronized的一部分。
锁主要提供了两种特性:互斥和可见性。
互斥是指一次只能有一个线程持有某个特定的锁,这样一次只有一个线程可以访问共享变量。
可见性是保证线程释放锁之前对一个共享变量的更改对随后持有这个锁的线程是可见的。
volatile变量具有synchronized可见性,但是不具备原子性。
要使volatile提供线程安全的变量,必须满足下面两个条件:
- 对变量的写操作不依赖当前值。
- 该变量没有包含在具有其他变量的不变式中。