电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java多線程volatile原理及用法解析

瀏覽:44日期:2022-08-28 10:36:39

首先volatile有兩大功能:

保證線程可見性

禁止指令重排序

1、保證線程可見性

首先我們來看這樣一個程序,其中不加volatile關鍵字運行的結果截然不同,加上volatile程序能夠正常結束,不加則程序進入死循環;

package com.designmodal.design.juc01;import java.util.concurrent.TimeUnit;/** * @author D-L * @Classname T001_volatile * @Version 1.0 * @Description volatile 保證線程的可見性 * @Date 2020/7/19 17:30 */public class T001_volatile { //定義一個變量running volatile boolean running = true; public void m(){ while(running){ //TODO 不做任何的處理 System.out.println('while is running When can I stop -------------'); } System.out.println('method is end ---------------'); } public static void main(String[] args) { T001_volatile t001_volatile = new T001_volatile(); new Thread(t001_volatile::m , 'Thread t1').start(); //停一秒 try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } //修改running的值 t001_volatile.running = false; }}

通過上面的小程序說明volatile是具有保證線程之間的可見性的功能的,具體是如何實現的呢?下面給大家解釋一下:

之前在上一篇講synchronized時提到了 堆內存是線程共享的,而線程在工作時有自己的工作內存,對于共享變量running來說,線程1和線程2在運行的時候先把running變量copy到自己工作內存,對這個變量的改變都是在自己的工作內存中,并不會直接的反映到其他線程,如果加了volatile,running變量改變其他線程很快就會知道,這就是線程的可見性;

Java多線程volatile原理及用法解析

這里用到的是:MESI(CPU緩存一致性協議) MESI的主要思想:當CPU寫數據時,如果該變量是共享數據,給其他CPU發送信號,使得其他的CPU中的該變量的緩存行無效;歸根結底這里需要借助硬件來幫助我們。

Java多線程volatile原理及用法解析

volatile保證線程可見性但是不能代替synchronized:

package com.designmodal.design.juc01;import java.util.ArrayList;import java.util.List;/** * @author D-L * @Classname VolatileAndSynchronized * @Version 1.0 * @Description synchronized can not be replaced by volatile *volatile 不能代替synchronized *只能保證可見性 不能保證原子性 *count++ 不是原子性操作 * @Date 2020/xx/xx 23:25 */public class VolatileAndSynchronized { volatile int count = 0; public synchronized void m(){ for (int i = 0; i < 1000; i++) { //非原子性操作 匯編指令至少有三條 count++; } } public static void main(String[] args) { VolatileAndSynchronized v = new VolatileAndSynchronized(); List<Thread> threads = new ArrayList<>(); for (int i = 0; i < 10; i++) { threads.add(new Thread(v::m , 'Thread'+ i)); } threads.forEach(o ->o.start()); threads.forEach(o ->{ try {o.join(); } catch (InterruptedException e) {e.printStackTrace(); } }); System.out.println(v.count); }}

2、禁止指令重排序

指令重排序也是和CPU有關系,加了volatile之后,每次寫都會背線程看到。CPU原來執行指令時,是按照一步一步順序來執行的,但是CPU為了提高效率它會把指令并發來執行,第一個指令執行到一半的時候第二條指令就可能已經開始執行了,這叫流水線式的執行;為了充分的利用CPU,就要求編譯器把編譯完的源碼指令,可能會進行一個指令重新排序;這種架構通過實際驗證,很大效率上提高了CPU的使用效率。

下面從一個面試題來討論一下指令重排序:

面試官:你聽過單例模式嗎?

你:當然聽過,不然沒法聊了。

package com.designmodal.design.juc01;import java.util.concurrent.TimeUnit;/** * @author D-L * @Classname T002_volatile * @Version 1.0 * @Description volatile 指令重排序 * @Date 2020/7/20 00:48 */public class T002_volatile { //創建私有的 T002_volatile 有人會問這里的volatile要不要使用,這里的答案是肯定的 private static /**volatile*/ volatile T002_volatile INSTANCE; public T002_volatile() {} public T002_volatile getInstance(){ //模擬業務代碼 這里為了synchronized更加細粒度,所以使用了雙重檢查 if(INSTANCE == null){ synchronized (this){ //雙重檢查 if(INSTANCE == null){ //避免線程之間的干擾 在這里睡一秒 try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } //創建實例對象 INSTANCE = new T002_volatile(); } } } return INSTANCE; } /** * 創建100個線程 調用getInstance() 打印hashcode值 * @param args */ public static void main(String[] args) { T002_volatile t001_volatile = new T002_volatile(); for (int i = 0; i < 100; i++) { new Thread(() ->{T002_volatile instance = t001_volatile.getInstance();System.out.println(instance.hashCode()); }).start(); } }}

在上述的代碼中:INSTANCE = new T002_volatile(); 經過編譯后的指令是分三步的

1、給指令申請內存

2、給成員變量初始化

3、把這塊對象的內容賦給INSTANCE

在第二步這里既然已經有默認值了,第二個線程來檢查,發現已經有值了根本就不會進入鎖住的那份代碼;加了volatile就不會出現指令重排序了,所以在這個時候一定要保證初始化完成之后才會賦值給這個變量,這就是volatile存在的意義。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 空气能暖气片,暖气片厂家,山东暖气片,临沂暖气片-临沂永超暖通设备有限公司 | 长沙中央空调维修,中央空调清洗维保,空气能热水工程,价格,公司就找维小保-湖南维小保环保科技有限公司 | ★济南领跃标识制作公司★济南标识制作,标牌制作,山东标识制作,济南标牌厂 | 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | led全彩屏-室内|学校|展厅|p3|户外|会议室|圆柱|p2.5LED显示屏-LED显示屏价格-LED互动地砖屏_蕙宇屏科技 | 提升海外网站流量,增加国外网站访客UV,定制海外IP-访客王 | 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 | 新疆十佳旅行社_新疆旅游报价_新疆自驾跟团游-新疆中西部国际旅行社 | 蓄电池在线监测系统|SF6在线监控泄露报警系统-武汉中电通电力设备有限公司 | 山东商品混凝土搅拌楼-环保型搅拌站-拌合站-分体仓-搅拌机厂家-天宇 | 美国HASKEL增压泵-伊莱科elettrotec流量开关-上海方未机械设备有限公司 | 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 超声波清洗机_大型超声波清洗机_工业超声波清洗设备-洁盟清洗设备 | 臭氧实验装置_实验室臭氧发生器-北京同林臭氧装置网 | 东风体检车厂家_公共卫生体检车_医院体检车_移动体检车-锦沅科贸 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 广西资质代办_建筑资质代办_南宁资质代办理_新办、增项、升级-正明集团 | 仪器仪表网 - 永久免费的b2b电子商务平台 | 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 818手游网_提供当下热门APP手游_最新手机游戏下载 | 外观设计_设备外观设计_外观设计公司_产品外观设计_机械设备外观设计_东莞工业设计公司-意品深蓝 | 安驭邦官网-双向万能直角铣头,加工中心侧铣头,角度头[厂家直销] 闸阀_截止阀_止回阀「生产厂家」-上海卡比阀门有限公司 | 小港信息港-鹤壁信息港 鹤壁老百姓便民生活信息网站 | 产业规划_产业园区规划-产业投资选址及规划招商托管一体化服务商-中机院产业园区规划网 | 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 撕碎机,撕破机,双轴破碎机-大件垃圾破碎机厂家 | 除甲醛公司-甲醛检测治理-杭州创绿家环保科技有限公司-室内空气净化十大品牌 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 搜木网 - 木业全产业链交易平台,免费搜货、低价买货! | 广州活动策划公司-15+年专业大型公关活动策划执行管理经验-睿阳广告 | 小型玉石雕刻机_家用玉雕机_小型万能雕刻机_凡刻雕刻机官网 | 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 成都LED显示屏丨室内户外全彩led屏厂家方案报价_四川诺显科技 | 电动葫芦-河北悍象起重机械有限公司 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 食品质构分析仪-氧化诱导分析仪-瞬态法导热系数仪|热冰百科 | 月嫂_保姆_育婴_催乳_母婴护理_产后康复_养老护理-吉祥到家家政 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 齿轮减速电机一体机_蜗轮蜗杆减速马达-德国BOSERL齿轮减速机带电机生产厂家 | 小型气象站_车载气象站_便携气象站-山东风途物联网 | 釜溪印象网络 - Powered by Discuz!|