首页 > 代码库 > volatile变量

volatile变量

volatile变量,用来确保将变量的更新操作通知到其他线程,volatile变量的操作必须是原子性的,如果不是原子性的则变量内存可见性会出现意想不到的异常。在代码中如果依赖volatile变量来控制状态的可见性,其很可能比使用synchroized锁更脆弱,也更难理解。

仅当volatile变量能简化代码的实现以及对同步策略的验证时,才应该使用它们。如果在验证正确性时需要对可见性进行复杂的判断,那么就不要使用volatile变量。volatile变量的正确使用方式包括:确保它们自身状态的可见性,确保他们所引用对象的状态的可见性,以及标示一些重要的程序生命周期事件的发生。(例如初始化活关闭)

如果对变量可见性进行复杂的判断时如果是分布式的则可以使用memcache或者redis等第三方工具,通过对第三方的分布式锁,使得变量在不同实例程序中总是只有一种状态,而不会同时出现多种不可预测的状态。

注意:Java代码有可能会出现多种排序(如果没有使用特殊的标记)如:编译器级别的排序、服务器排序、操作系统的排序。

使用volatile变量标会使得在重新排序时volatile变量标记之前的代码不会重新排序到volatile变量标记之后。sychronized变量锁也是相同的。如果volatile变量的操作不能保证原子性,则尽可能不使用。

 

加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。

 

当且仅当满足以下条件时才应该使用volatile变量:

1、对变量的写操作不依赖变量的当前值,或者变量在更新时只有单个线程在操作。

2、该变量不会与其他状态变量一起纳入不变形条件中。?

3、在访问变量时不需要加锁还能保证操作的完全正确性。

 

volatile变量