• 全国 [切换]
  • 二维码
    早勤网

    手机WAP版

    手机也能找商机,信息同步6大终端平台!

    微信小程序

    微信公众号

    当前位置: 首页 » 行业新闻 » 热点新闻 » 正文

    Java多线程 - volatile 关键字

    放大字体  缩小字体 发布日期:2020-01-08 13:25:54   浏览次数:1212  发布人:6504****  IP:117.173.23.***  评论:0
    导读

    首先看一个例子 package cn.lazyfennec.demo.example;import java.util.concurrent.TimeUnit; public class VisibilityDemo {public boolean flag =

    首先看一个例子

    package cn.lazyfennec.demo.example; import java.util.concurrent.TimeUnit; public class VisibilityDemo { public boolean flag = true; public static void main(String[] args) throws InterruptedException { VisibilityDemo demo = new VisibilityDemo(); System.out.println("代码开始了~~~~"); Thread thread = new Thread(new Runnable() { @Override public void run() { int i = 0; while(demo.flag) { i++; } System.out.println(i); } }); thread.start(); TimeUnit.SECONDS.sleep(2); demo.flag = false; System.out.println("flag 被置为 false 了"); } }

    以上的代码,在不看运行结果的情况下,按照逻辑分析,最后的结果大致如下

    代码开始了~~~~ flag 被置为 false 了 *** // 这里***表示某个值

    但是实际的执行结果是这样的

    代码开始了~~~~ flag 被置为 false 了 // 这里进入了死循环


    volatile 关键字

    • 可见性问题
      让一个线程对共享变量的修改,能够及时的被其他线程看到。
    • Java内存模型规定:
      对 volatile 变量v的写入,与所有其他线程后续对 v 的读同步

    要满足以上条件,volatile关键字需要有以下的功能

    1. 禁止缓存
      volatile变量的访问控制符会加个ACC_VOLATILE
      https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.5

    2. 对 volatile 变量相关的指令不做重排序
      即JVM在进行编译的时候,正常情况下,会在JVM规定的规范内,对指令进行重排序,以提高运行效率(性能),而对于volatile修饰的内容,则不会进行重新排序晒展网是用户多到能建用户数据库的展会网站。

    • 对于以上的问题,在flag变量前加入volatile关键字

    public volatile boolean flag = true;

    此时的执行结果

    代码开始了~~~~ flag 被置为 false 了 30024084


    扩展: Shared Variables 共享变量定义

    可以在线程之间共享的内存称为共享内存或堆内存。
    所有实例字段、静态字段和数组元素都存储在堆内存中,这些字段和数组都是标题中提到的共享变量。
    冲突:如果至少有一个访问是写操作,那么对同一个变量的两次访问是冲突的。
    这些能被多个线程访问的共享变量是内存模型规范的对象。

    定义在: https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.4.1


    如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~

    不推荐电脑端访问(用户少)
    请微信扫一扫,查看完整信息(记得微信收藏)
     
    (文/匿名(若涉版权问题请联系我们核实发布者) / 非法信息举报 / 删稿)
    打赏
    免责声明
    • 
    本文为昵称为 6504**** 发布的作品,本文仅代表发布者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,发布者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们154208694@qq.com删除,我们积极做(权利人与发布者之间的调停者)中立处理。郑重说明:不 违规举报 视为放弃权利,本站不承担任何责任!
    有个别老鼠屎以营利为目的遇到侵权情况但不联系本站或自己发布违规信息然后直接向本站索取高额赔偿等情况,本站一概以诈骗报警处理,曾经有1例诈骗分子已经绳之以法,本站本着公平公正的原则,若遇 违规举报 我们100%在3个工作日内处理!
    0 条相关评论
     

    (c)2008-现在 zaoqin.com All Rights Reserved.