Java中volatile关键字的最简单易懂的例子

我正在阅读 Java中的volatile关键字并完全理解它的理论部分.

但是,我正在寻找的是一个很好的案例,它展示了如果变量不是易变的话会发生什么.

下面的代码段不能按预期工作(取自here):

class Test extends Thread {

    boolean keepRunning = true;

    public void run() {
        while (keepRunning) {
        }

        System.out.println("Thread terminated.");
    }

    public static void main(String[] args) throws InterruptedException {
        Test t = new Test();
        t.start();
        Thread.sleep(1000);
        t.keepRunning = false;
        System.out.println("keepRunning set to false.");
    }
}

理想情况下,如果keepRunning不是volatile,则线程应该无限期地继续运行.但是,它会在几秒钟后停止.

我有两个基本问题:

>任何人都可以用例子解释volatile吗?不是来自JLS的理论.
>是同步的易失性替代品吗?它是否实现了原子性?

挥发性 – >保证可见性而非原子性

同步(锁定) – >保证可见性和原子性(如果正确完成)

易失性不能代替同步

仅在更新引用且不对其执行某些其他操作时使用volatile.

例:

volatile int i = 0;

public void incrementI(){
   i++;
}

不使用同步或AtomicInteger将不是线程安全的,因为递增是复合操作.

Why program does not run indefinitely?

那取决于各种情况.在大多数情况下,JVM足够智能来刷新内容.

Correct use of volatile讨论了挥发性物质的各种可能用途.正确使用volatile非常棘手,我会说“如果有疑问,请将其保留”,请使用synchronized块.

也:

可以使用synchronized块代替volatile,但反之则不然.

相关文章
相关标签/搜索