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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java Synchronize下的volatile關(guān)鍵字詳解

瀏覽:104日期:2022-08-15 14:07:16

簡(jiǎn)介關(guān)鍵詞:Synchronize與volatile

Synchronize:無(wú)論是對(duì)于Synchronize同步方法異或是Synchronize塊,本質(zhì)是對(duì)某對(duì)象或某類加鎖,讓多線程進(jìn)行隊(duì)列化的有序地同步執(zhí)行。 volatile:用于修飾變量。在多線程執(zhí)行過(guò)程中,禁止線程從工作內(nèi)存(緩存)中讀取值。

volatile問(wèn)題拋出:

讓我們看到這樣一個(gè)問(wèn)題,我們?cè)O(shè)置一個(gè)含有boolean標(biāo)志位的類Test,以及兩個(gè)Runable接口實(shí)例,分別為MyThread1,MyThread2。在MyThread1中通過(guò)while循環(huán)判斷flag是否更改,如果更改便結(jié)束循環(huán)退出。在MyThread2中改變flag值。代碼如下:Test:

public class Test { boolean flag = true;}

MyThread1:

public class MyThread1 implements Runnable{ Test test; public MyThread1(Test test){ this.test = test; } @Override public void run() { while (test.flag){ } System.out.println(Thread.currentThread().getName()+' 我已退出'); }}

MyThread2:

public class MyThread2 implements Runnable{ Test test; public MyThread2(Test test){ this.test = test; } @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } test.flag = false; }}

main函數(shù):

public static void main(String[] args) { Test test = new Test(); MyThread1 myThread1 = new MyThread1(test); MyThread2 myThread2 = new MyThread2(test); Thread thread1 = new Thread(myThread1); Thread thread2 = new Thread(myThread2); thread1.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } thread2.start();} 按照我們常規(guī)的想法,在在Sleep延時(shí)之后,Thread2會(huì)更改flag的值。而Thread1也會(huì)因此退出循環(huán)。 但實(shí)際上,Thread1并沒有因此退出循環(huán)。 原因是Thread1并未從內(nèi)存中讀取flag,而是直接從工作內(nèi)存中讀取。所以即便是Thread2已經(jīng)更新了flag的值,但Thread1工作內(nèi)存中的flag也并未更新。所以便導(dǎo)致了Thread1陷入死循環(huán)。

Java Synchronize下的volatile關(guān)鍵字詳解

解決方法:

那么如何解決這樣的問(wèn)題呢?很簡(jiǎn)單,使用volatile關(guān)鍵字。讓線程不得不從主內(nèi)存中讀取flag值。

volatile boolean flag = true;

在我們添加volatile關(guān)鍵字后,Thread1便可以正常退出。

在Synchronize下的volatile:

此時(shí)我們已經(jīng)了解了volatile關(guān)鍵字的作用,那么在我們的volatile關(guān)鍵字中,Synchronize有著怎樣的作用呢?

volatile問(wèn)題拋出:

其實(shí)在我們實(shí)際使用中,volatile其實(shí)也是有一些隱患的。例如:我們創(chuàng)造10條線程,每條線程都使volatile修飾的int常量增加1000000次。

public class MyThread1 implements Runnable{ volatile int num = 0; @Override public void run() { for (int i = 0; i < 1000000; i++) { num++; System.out.println(Thread.currentThread().getName()+' '+num); } } public static void main(String[] args) { MyThread1 myThread1 = new MyThread1(); Thread[] arr = new Thread[10]; for (int i = 0; i < 10; i++) { arr[i] = new Thread(myThread1); } for (int i = 0; i < 10; i++) { arr[i].start(); } }}

Java Synchronize下的volatile關(guān)鍵字詳解

分析: 從結(jié)果中,我們可以看到,num并沒有像我們想象一樣達(dá)到10000000。 這是因?yàn)関olatile所修飾的int變量在自加過(guò)程中并非原子操作。這也就是說(shuō)這個(gè)自加的過(guò)程可以被打斷。可以被分解為:獲取值,自加,賦值三個(gè)步驟。 例如當(dāng),num = 0時(shí),Thread1獲取了num的值,并賦值為1,但此時(shí)在Thread1還未來(lái)得及更新線程的時(shí)候,Thread的2以及Thread3已經(jīng)將線程的值更新為2,但Thread1再賦值,num的值又會(huì)重新變?yōu)?。 所以,我們便需要在自加的過(guò)程中添加Synchronize關(guān)鍵字,讓線程實(shí)現(xiàn)同步。結(jié)論:

在我們使用volatile關(guān)鍵字時(shí),需要注意操作是否為原子操作,以免造成線程不安全。

擴(kuò)展:

其實(shí),對(duì)于原子操作,Java已經(jīng)提供了Atomic原子類來(lái)解決。其中涉及了CAS機(jī)制,在不使用Synchronize的情況下,通過(guò)比較原值與當(dāng)前值,不但性能高效,并且也能達(dá)到線程安全的目的。

到此這篇關(guān)于Synchronize下的volatile關(guān)鍵字 的文章就介紹到這了,更多相關(guān)Synchronize volatile關(guān)鍵字 內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | 旋片真空泵_真空泵_水环真空泵_真空机组-深圳恒才机电设备有限公司 | 酒店品牌设计-酒店vi设计-酒店标识设计【国际级】VI策划公司 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 浙江寺庙设计-杭州寺院设计-宁波寺庙规划_汉匠 | 仿古瓦,仿古金属瓦,铝瓦,铜瓦,铝合金瓦-西安东申景观艺术工程有限公司 | 潜水搅拌机-双曲面搅拌机-潜水推进器|奥伯尔环保 | 磁粉制动器|张力控制器|气胀轴|伺服纠偏控制器整套厂家--台灵机电官网 | 哈希余氯测定仪,分光光度计,ph在线监测仪,浊度测定仪,试剂-上海京灿精密机械有限公司 | 防爆型气象站_农业气象站_校园气象站_农业四情监测系统「山东万象环境科技有限公司」 | 识禅_对禅的了解,从这里开始| 船用烟火信号弹-CCS防汛救生圈-船用救生抛绳器(海威救生设备) | 金属检测机_金属分离器_检针验针机_食品药品金属检探测仪器-广东善安科技 | 垃圾压缩设备_垃圾处理设备_智能移动式垃圾压缩设备--山东明莱环保设备有限公司 | 大立教育官网-一级建造师培训-二级建造师培训-造价工程师-安全工程师-监理工程师考试培训 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 制丸机,小型中药制丸机,全自动制丸机价格-甘肃恒跃制药设备有限公司 | Brotu | 关注AI,Web3.0,VR/AR,GPT,元宇宙区块链数字产业 | 宝鸡市人民医院| 烟雾净化器-滤筒除尘器-防爆除尘器-除尘器厂家-东莞执信环保科技有限公司 | 非甲烷总烃分析仪|环控百科| 工业用品一站式采购平台|南创工品汇-官网|广州南创 | 权威废金属|废塑料|废纸|废铜|废钢价格|再生资源回收行情报价中心-中废网 | 办公室装修_上海办公室设计装修_时尚办公新主张-后街印象 | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 定制异形重型钢格栅板/钢格板_定做踏步板/排水沟盖板_钢格栅板批发厂家-河北圣墨金属制品有限公司 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 工业rfid读写器_RFID工业读写器_工业rfid设备厂商-ANDEAWELL | 领袖户外_深度旅游、摄影旅游、小团慢旅行、驴友网 | 艺术漆十大品牌_艺术涂料加盟代理_蒙太奇艺术涂料厂家品牌|艺术漆|微水泥|硅藻泥|乳胶漆 | 骨密度检测仪_骨密度分析仪_骨密度仪_动脉硬化检测仪专业生产厂家【品源医疗】 | 江苏南京多语种翻译-专业翻译公司报价-正规商务翻译机构-南京华彦翻译服务有限公司 | 中矗模型-深圳中矗模型设计有限公司 | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | sfp光模块,高速万兆光模块工厂-性价比更高的光纤模块制造商-武汉恒泰通 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 电机铸铝配件_汽车压铸铝合金件_发动机压铸件_青岛颖圣赫机械有限公司 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 质构仪_鱼糜弹性仪-上海腾拔仪器科技有限公司 |