Java语言提供了一种稍弱的关键词,即Volatile变量,用来确保将变量的更新操作通知到其它线程。
仅当Volatile变量能简化代码的实现以及对同步的策略的验证时,才应该使用它们。如果在验证正确性时需要对可见性进行复杂的判断,那么就不要使用Volatile变量。
正确的使用方式包括:确保它们自身的状态的可见性,确保它们所引用的状态的可见性,以及表示一些重要的程序的生命周期事件的发生(例如:初始化或关闭)
加锁机制既可以确保可见性又可以保证原子性,而volatile变量只能确保可见性。
package practice3_1_4;
/**
* @Author ghz 【351150710@qq.com】
* practice3_1_4
* @Date 2018/6/8 下午11:42
*/
public class VolatileDemo {
/**
* volatile 用来将变量的更新操作及时通知到其它的线程
*/
public volatile boolean flag = false;
void run(){
new ThreadOne().start();
new ThreadTwo().start();
}
public static void main(String[] args) {
System.out.println("test");
VolatileDemo demo = new VolatileDemo();
demo.run();
}
class ThreadOne extends Thread{
@Override
public void run() {
while (!flag){
System.out.println("ThreadOne running ...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class ThreadTwo extends Thread {
@Override
public void run() {
try {
Thread.sleep(9000);
//终止线程一继续执行
flag = true;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}