加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 07:36:18 所属栏目:Java 来源:网络整理
导读:我正在阅读 Java中的volatile关键字并完全理解它的理论部分. 但是,我正在寻找的是一个很好的案例,它展示了如果变量不是易变的话会发生什么. 下面的代码段不能按预期工作(取自here): class Test extends Thread { boolean keepRunning = true; public void r
我正在阅读 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,但反之则不然.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读