Java-volatile-关键字详解

By Diskobólos

Java volatile 关键字详解

2020-2-15

定义:

volatile关键是声明的变量表示有其他线程可能会更改该变量的值,所以各线程对于volatile定义的变量必须从主存中获取,而不能通过缓存中获取,但是volatile字段是非阻塞的,即无锁的,也就是说,它只保证每次从主存中获取数据,但是不能让read- update-write过程是成为一个原子操作,这也是它和Synchronized关键字的一个重要区别。


实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class StoppableTask extends Thread {
private volatile boolean pleaseStop;

public void run() {
while (!pleaseStop) {
// do some stuff...
}
}

public void tellMeToStop() {
pleaseStop = true;
}
}
`

如果不加volatile关键字,一开始run()进程便从cache中读到pleaseStop的值为false,是合法的,虽然tellStop()进程可能已经改变了pleaseStop的值为true),但run()进程不会再读pleaseStop的值。


与Synchronized关键字区别:

来源于参考链接


参考:

https://www.javamex.com/tutorials/synchronization_volatile.shtml.

www.javamex.com/tutorialssynchronization_volatile_typical_use.shtml.