volatile仅为您提供其他可见性保证,多头/双数的原子写/读(否则JLS不保证,是的)和某些内存顺序保证。 没有
同步(虽然可以从volatile开始构建同步块-Dekker的算法),所以不,它无济于事
x++-仍然是读取,写入和写入,并且需要某种形式的同步。
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,则可能不会。



