volatile 只为您提供额外的可见性保证、longs/doubles 的原子写入/读取(否则 JLS 不保证,是的)和一些内存顺序保证。没有同步(虽然可以从 volatile 开始构建同步块 - Dekker 的算法)所以不,它对您没有帮助x++
- 这仍然是读取,inc 和写入,并且需要某种形式的同步。
volatile 的一个例子是著名的双重检查锁定,我们在大多数情况下避免同步,因为我们只需要顺序保证:
private volatile Helper helper = null;
public Helper getHelper() {
if (helper == null) {
synchronized(this) {
if (helper == null) {
helper = new Helper();
}
}
}
return helper;
}
一个绝对不涉及同步的示例是一个简单的退出标志,这里它不是关于订购保证,而只是关于保证可见性
public volatile boolean exit = false;
public void run() {
while (!exit) doStuff();
// exit when exit set to true
}
如果另一个线程设置exit = true
了另一个执行 while 循环的线程,则可以保证看到更新 - 没有 volatile 它可能不会。