文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何学习Java volatile关键字

2023-06-02 22:27

关注

今天就跟大家聊聊有关如何学习Java volatile关键字,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

相信大多数Java程序员都学习过volatile这个关键字的用法。百度百科上对volatile的定义:

volatile是一个类型修饰符(type specifier),被设计用来修饰被不同线程访问和修改的变量。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

可能有很多刚学Java的朋友们看了上面这段非常笼统的描述后仍然觉得云里雾里的。

下面我们就用一个具体的例子来学习volatile的用法。

看这个例子:

public class ThreadVerify {    public static Boolean stop = false;    public static void main(String args[]) throws InterruptedException {        Thread testThread = new Thread(){            @Override            public void run(){                int i = 1;                while(!stop){                    //System.out.println("in thread: " + Thread.currentThread() + " i: " + i);                    i++;                }                System.out.println("Thread stop i="+ i);            }        }        ;        testThread.start();        Thread.sleep(1000);        stop = true;        System.out.println("now, in main thread stop is: " + stop);        testThread.join();    }}

这段代码在主线程的第二行定义了一个布尔变量stop, 然后主线程启动一个新线程,在线程里不停得增加计数器i的值,直到主线程的布尔变量stop被主线程置为true才结束循环。

主线程用Thread.sleep停顿1秒后将布尔值stop置为true。

如何学习Java volatile关键字

因此,我们期望的结果是,上述Java代码执行1秒钟后停止,并且打印出1秒钟内计数器i的实际值。

然而,执行这个Java应用后,你发现它进入了死循环,在任务管理器里发现这个Java程序CPU占用率飙升。

原因是什么呢?让我们温习下计算机专业课操作系统中讲过的内存模型的知识。

以Java内存模型为例,Java内存模型分为主内存(main memory)和工作内存(work memory)。主内存内的变量由所有线程共享,每个线程拥有自己的工作内存,里面的变量包含了线程局部变量。主内存中的变量如果被线程使用到,则线程的工作内存会维护一份主内存变量的副本拷贝。

如何学习Java volatile关键字

线程对变量的所有读写操作必须在工作内存中进行,不能直接操作主内存中的变量。不同线程之间也无法直接访问对方的工作内存。线程间变量的传递需通过主内存来完成。线程、主内存、工作内存三者之间的交互关系如下图:

如何学习Java volatile关键字

如果线程在自己的执行代码里修改了定义在主线程(主内存)中的变量,修改直接发生在线程的工作内存里,然后在某个时刻(Java程序员无法控制这个时刻,而是由JVM调度的),这个修改从工作内存写回到主内存。

回到我们的例子。尽管主线程修改了stop变量,但是仅仅修改了主内存中的值,而操作计数器的线程的工作内存里的stop变量还是旧的值,始终为false。因此这个线程陷入了死循环。

如何学习Java volatile关键字

知道了原理,解决方案就很简单了。在stop变量前加上关键字volatile进行修饰,这样在计数器线程里每次读取stop的值时,volatile会强制该线程从主内存读取,而不是从当前线程的工作内存读取。这样就避免了死循环。下图显示1秒钟之后,计数器执行了14亿次。

如何学习Java volatile关键字

看完上述内容,你们对如何学习Java volatile关键字有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯