游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Java并发编程初识Volatile(概念与特性)

  一、什么是Volatile概念
  volatile是Java中的关键字,用来修饰会被不同线程访问和修改的变量。volatile可以说是java虚拟机提供的最轻量级的同步机制。二、特性1、保证可见性概述
  保证不同线程对这个变量进行操作时的可见性,即变量一旦改变所有线程立即可见。代码验证publicclassVolatileSeeDemo{staticbooleanflagtrue;publicstaticvoidmain(String〔〕args){newThread((){System。out。println(Thread。currentThread()。getName()comein);while(flag){}System。out。println(Thread。currentThread()。getName()comeout);},t1)。start();线程睡眠2stry{TimeUnit。MILLISECONDS。sleep(2000);}catch(Exceptione){e。printStackTrace();}flagfalse;System。out。println(Thread。currentThread()。getName()修改完成);}}
  输出结果:程序无法正常结束
  线程t1中为何看不到被主线程main修改为false的flag的值?
  问题可能:主线程修改了flag之后没有将其刷新到主内存,所以t1线程看不到。主线程将flag刷新到了主内存,但是t1一直读取的是自己工作内存中flag的值,没有去主内存中更新获取flag最新的值。
  解析
  由于普通变量没有可见性,无法感知结果的变化,主线程将flag刷新到了主内存,但是t1一直读取的是自己工作内存中flag的值,没有去主内存中更新获取flag最新的值。故while里面的flag始终是ture,因此导致程序一直在while循环中。
  下面用volatile修饰flagpublicclassVolatileSeeDemo{staticvolatilebooleanflagtrue;publicstaticvoidmain(String〔〕args){newThread((){System。out。println(Thread。currentThread()。getName()comein);while(flag){}System。out。println(Thread。currentThread()。getName()comeout);},t1)。start();线程睡眠2stry{TimeUnit。MILLISECONDS。sleep(2000);}catch(Exceptione){e。printStackTrace();}flagfalse;System。out。println(Thread。currentThread()。getName()修改完成);}}
  运行结果:程序正常结束
  解释
  由于flag被volatile修饰,故其具有可见性,flag的每一次修改都会被发现,flag由true变为false,循环结束。volatile修改的变量特点线程中读取的时候,每次读取都会去主内存中读取共享变量最新的值,然后将其复制到工作内存。线程中修改了工作内存中变量的副本,修改之后会立即刷新到主内存。volatile变量的读写过程
  Java内存模型中定义的8种工作内存与主内存之间的原子操作
  read(读取)load(加载)use(使用)assign(赋值)store(存储)write(写入)lock(锁定)unlock(解锁)
  read:作用于主内存,将变量的值从主内存传输到工作内存,主内存到工作内存
  load:作用于工作内存,将read从主内存传输的变量值放入工作内存变量副本中,即数据加载
  use:作用于工作内存,将工作内存变量副本的值传递给执行引擎,每当JVM遇到需要该变量的字节码指令时会执行该操作
  assign:作用于工作内存,将从执行引擎接收到的值赋值给工作内存变量,每当JVM遇到一个给变量赋值字节码指令时会执行该操作
  store:作用于工作内存,将赋值完毕的工作变量的值写回给主内存
  write:作用于主内存,将store传输过来的变量值赋值给主内存中的变量
  由于上述只能保证单条指令的原子性,针对多条指令的组合性原子保证,没有大面积加锁,所以,JVM提供了另外两个原子指令:
  lock:作用于主内存,将一个变量标记为一个线程独占的状态,只是写时候加锁,就只是锁了写变量的过程。
  unlock:作用于主内存,把一个处于锁定状态的变量释放,然后才能被其他线程占用2、没有原子性概述
  原子性指的是一个操作是不可中断的,即使是在多线程环境下,一个操作一旦开始就不会被其他线程影响。代码验证classMyNumber{staticintnumber0;publicstaticvoidadd(){number;}}publicclassVolatileNoAtomicDemo{publicstaticvoidmain(String〔〕args){for(inti0;i10;i){newThread((){for(inti10;i11000;i1){MyNumber。add();}},String。valueOf(i))。start();}暂停3s线程try{TimeUnit。MILLISECONDS。sleep(3000);}catch(Exceptione){e。printStackTrace();}System。out。println(Thread。currentThread()。getName()myNumber:MyNumber。number);}}
  输出结果
  理论上是输出1010001w的,为什么这里只有4312呢?字节码角度分析
  原子性指的是一个操作是不可中断的,即使是在多线程环境下,一个操作一旦开始就不会被其他线程影响。publicvoidadd(){i;不具备原子性,该操作是先读取值,然后写回一个新值,相当于原来的值加上1,分3步完成}
  如果第二个线程在第一个线程读取旧值和写回新值期间读取i的域值,那么第二个线程就会与第一个线程一起看到同一个值,
  并执行相同值的加1操作,这也就造成了线程安全失败(即一个线程更新数据完成后去刷新主内存,导致正在修改数据的线程直接结束,因此造成部分i失效,而循环次数一直在累加),因此对于add方法必须使用synchronized修饰,以便保证线程安全。不保证原子性原因
  多线程环境下,数据计算和数据赋值操作可能多次出现,即操作非原子。若数据在加载之后,若主内存count变量发生修改之后,由于线程工作内存中的值在此前已经加载,从而不会对变更操作做出相应变化,即私有内存和公共内存中变量不同步,进而导致数据不一致。
  对于volatile变量,JVM只是保证从主内存加载到线程工作内存的值是最新的,也就是数据加载时是最新的。
  由此可见volatile解决的是变量读时的可见性问题,但无法保证原子性,对于多线程修改共享变量的场景必须使用加锁同步既然一修改就是可见,为什么还不能保证原子性?
  volatile主要是对其中部分指令做了处理
  要use(使用)一个变量的时候必需load(载入),要载入的时候必需从主内存read(读取)这样就解决了读的可见性。
  写操作是把assign和store做了关联(在assign(赋值)后必需store(存储))。store(存储)后write(写入)。
  也就是做到了给一个变量赋值的时候一串关联指令直接把变量值写到主内存。
  就这样通过用的时候直接从主内存取,在赋值到直接写回主内存做到了内存可见性。注意蓝色框框的间隙o()o
  总结
  读取赋值一个volatile变量的情况
  readloaduse和assignstorewrite成为了两个不可分割的原子操作,但是在use和assign之间依然有极小的一段真空期,有可能变量会被其他线程读取,导致写丢失一次。。。o()o
  但是无论在哪一个时间点主内存的变量和任一工作内存的变量的值都是相等的。这个特性就导致了volatile变量不适合参与到依赖当前值的运算,如ii1;i;之类的那么依靠可见性的特点volatile可以用在哪些地方呢?通常volatile用做保存某个状态的boolean值orint值。
  《深入理解Java虚拟机》提到:
  3、禁止指令重排概述
  指令重排序是指编译器或CPU为了优化程序的执行性能而对指令进行重新排序的一种手段,重排序会带来可见性问题,所以在多线程开发中必须要关注并规避重排序。
  从源代码到最终运行的指令,会经过如下两个阶段的重排序。
  第一阶段,编译器重排序,就是在编译过程中,编译器根据上下文分析对指令进行重排序,目的是减少CPU和内存的交互,重排序之后尽可能保证CPU从寄存器或缓存行中读取数据。从CPU层面来说,避免了处理器每次都去内存中加载stop,减少了处理器和内存的交互开销。
  第二阶段,处理器重排序,处理器重排序分为两个部分。
  并行指令集重排序,这是处理器优化的一种,处理器可以改变指令的执行顺序。
  内存系统重排序,这是处理器引入StoreBuffer缓冲区延时写入产生的指令执行顺序不一致的问题。volatile有关的禁止指令重排的行为
  四大屏障的插入情况
  代码模拟
  模拟一个单线程,什么顺序读?什么顺序写?publicclassVolatileTest{inti0;volatilebooleanflagfalse;publicvoidwrite(){i2;flagtrue;}publicvoidread(){if(flag){System。out。println(ii);}}}
  在每一个volatile写操作前面插入一个StoreStore屏障在每一个volatile写操作后面插入一个StoreLoad屏障在每一个volatile读操作后面插入一个LoadLoad屏障在每一个volatile读操作后面插入一个LoadStore屏障

山东能源新矿集团2200万重奖科技创新本刊记者徐天宝通讯员商霞近日,在2022年山东能源新矿集团科技创新大会上,科技创新先进集体和个人代表、优秀创新成果代表披绶带、戴红花,登台受奖,现场爆发出一阵阵热烈的掌声……三项国家级赛事在雪游龙收官,冬奥奖牌获得者闫文港夺冠北京日报客户端记者李瑶通讯员陈争3月14日,在延庆奥林匹克园区国家雪车雪橇中心雪游龙,随着赛道上最后一辆雪车冲向终点,20222023赛季全国雪车锦标赛完成全部赛程。至此……降价最快的几款手机,性价比机型推荐,屏幕好,影像好,充电快教育听我说距离双十一活动,时间已经越来越近了,大部分打算换机的朋友变得犹豫,不知道该选哪款手机,面对众多的手机产品不知道如何选择,所以今天我就推荐几款性价比机型,屏幕好,影像好……父亲和女儿的关系,决定了女儿一生的命运有个好父亲是什么样的体验呢?作为女儿生命中的第一个异性形象,父亲对女儿的影响至关重要,就像作家梅格米克说的那样,比起其他任何人而言,父亲才是决定女儿人生轨迹的那个人。明事……正式确定!杨鸣弃用朱荣振,32岁老将收获信任,辽篮完成重大调进入第二阶段之后,辽宁男篮展现出极强的统治力,除了揭幕战不敌北京首钢之外,剩余5场比赛全部获得了胜利,全主力出战的辽宁男篮,统治力十分惊人。但是,从辽宁男篮的面对广东和首钢两支……多种配色三星GalaxyS22与GalaxyS22Ultra按照计划,三星会在2022上半年发布三款GalaxyS22系列智能机,包括标准版S22PlusS22Ultra机型。不过赶在2021年末,91Mobiles还是独家抢先放出了G……NBL季前赛刘传兴4分5篮板1助攻布里斯班子弹惜败阿德莱德3北京时间11月28日,澳大利亚NBL季前赛,布里斯班子弹对战阿德莱德36人。历经一番角逐,布里斯班子弹6772不敌阿德莱德36人。刘传兴此役贡献4分5篮板1助攻。数据统计……春节前的海南陵水荣盛香水湾春节前的海南陵水荣盛香水湾大年二十六,海南陵水荣盛香水湾这里游客开始爆涨,整个街道晚上热闹非凡,小超市里面人群川流不息,几乎全部都是外地游客,这里离三亚很近,但又不属于三……提醒中老年人伏天少碰米饭面条,多吃3种谷物,腿脚有劲精神足人到一定的年纪,身体的机能会大幅度下降,体质也会减弱,远远不如年轻的时候腿脚有劲儿。伏天气温高,比起黏黏糊糊的粥类,很多中老年人们吃饭还是会选择爽口的凉面、拌面,或者香喷喷的米……小米12S系列将有重大升级,小米11只好压价清仓沦为百元机骁龙8平台从三星的4nm工艺变成了TSMC的4nm工艺。基于Armv9架构的新KyroCPU由1个CortexX2超大核(3。2GHz)、3个CortexA710大核(2。75……厦门西坑彩石屋消失了!不复存在鹭客社:守望共同的尘世故乡如果您满意于下面的图文,请让更多的人关注鹭客社今天,有人告诉我,同安西坑的彩石屋已经不复存在!位于同安山区的西坑村海拔近1000米,……融创集团最新消息!孙宏斌久未露面,融创真实现状到底是什么?融创集团近况不顺,发展至今的融创集团,在孙宏斌带领下,创造许多辉煌成绩,从一个名不经传的小房企一步步成长为稳坐前三位置的大型民营房企,融创的步履艰难但不失色,发展一波三折但不影……
时隔3年终入选,留洋巨星力助水庆霞,却质疑是怕被归化外国中国女足公布新一期的集训名单,与之前公布的集训名单相比,这份名单的最大变化就是留洋球员的入围。虽说所有留洋球员并未悉数入列,但仍有8名留洋球员创造历史新高,可以说是如今中国女足……刘涛把职业装穿成了典范穿出了传奇,穿多久都不会过时冬末初春,面对新的一年,在职场上的女性无论是选择裙装,还是套装,但在当下潮流圈里,可以选择的职业装款式太多太多,完全能够满足女性的需求。那么好多职场女性不知道该怎么选职业……哈登还是你狠,仅为篮网打了76场比赛,便成为队史第一人在不久前结束的常规赛中,篮网以117102击败马刺,此役过程跌宕起伏,因为前两节篮网大部分时间都处于落后,第三节篮网占上风,末节欧文爆发,再加上哈登关键时刻造21和命中三分,篮……面对现实吧!3位将全部无缘NBA,这就是中国男篮目前的真实写当郭昊文、张镇麟、曾凡博三位球员纷纷代表球队参加夏季联赛的时候,我们很多球迷热情高涨。现在的夏季联赛正如火热荼地进行中,三位球员各自的球队都已经打过2场比赛,现在恐怕我们……姆巴佩学着点!梅西8大谦逊镜头伊布内马尔苏神都服他姆巴佩和内马尔闹不和的消息,传得沸沸扬扬。作为巴黎圣日耳曼的权力巨星,姆巴佩引发诸多争议:巴黎的进攻,队友没给姆巴佩传球,姆巴佩就散步玩消失,带着情绪踢球;撞到梅西……边界感和分寸感很重要这个世界上,人与人之间的关系是最简单也最复杂,关系太近,怕有隔阂,太过疏远,怕会失去。其实最好的状态就是保持边界感和分寸感。如果距离太近,很有可能会让对方觉得窒息。如果毫……NS也有多合一游戏卡,一份卡带钱买N款游戏不论你有没有经历过红白机时代,一定听说过那时候有一种N合一的盗版游戏卡。这种卡带往往会塞入一堆《超级马力欧》《魂斗罗》《坦克大战》之类的游戏,然后在卡带封面上一一列出来,……王公子退出董事职务,等同于放弃亿万家产?看看背后实控人吧据某权威系统显示,万达集团的太子爷王思聪,在前段时间的工商变动中退出董事职务。他曾手握万达集团2的股份,被王健林寄予厚望。但他也表示过不想接老爸的班。外界得知此事后纷纷猜测:王……昆仑格尔木格尔木昆仑山地势高峻,平均海拔50006000米,是柴达木盆地内陆水系和长江外流水系的分水岭,有世界第三极之称。昆仑山国家地质公园内的地质遗迹资源十分丰富,其中许多地质遗迹在国……腾讯游戏统一海外发行品牌,吹响全球扩张的号角作为全球最大的游戏厂商,腾讯游戏的一举一动无疑都受到着外界的诸多关注。日前,腾讯游戏方面宣布推出LevelInfinite这个全新的发行品牌,并致力于向全球用户提供高质量的游戏……兰溪镁梦能否成真?潮新闻策划徐贤飞记者薛文春兰溪人最近有点镁。长三角(兰溪)镁材料研究院投运;国际镁科学技术奖颁奖典礼、长三角镁产业战略发展座谈会、新时代镁材料产学研合作高峰论坛接连……多家媒体齐发力共创消费新未来中国网汽车2月24日讯中国网汽车联合黑猫投诉,共行315媒体守护倡议活动:守护市场环境,提振消费信心。消费是最终需求,是畅通国内大循环的关键环节和重要引擎,对经济具有持久……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网