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

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

JAVA內存模型和Happens-Before規則知識點講解

瀏覽:5日期:2022-08-21 08:18:32

我們在本篇內容里聊一聊JAVA的內存模型和Happens-Before規則。

JAVA內存模型

這里的JAVA內存模型指的不是我們JVM專欄中提到的內存分布模型,而是針對并發編程的,小伙伴們不要混淆概念了。

我們已經知道,導致可見性問題的是緩存,導致有序性問題的是指令重排,那么禁用緩存和禁用指令重排不就可以避免出現這兩種問題了嗎。

但想想也知道,如果直接禁用掉,性能會大打折扣,所以正確的方式應該是按需禁用。

只有程序員才能分析出什么時候應該禁用,所以為了解決可見性和有序性,其實只要提供給程序員按需禁用的API接口就可以了。

JAVA的內存模型是一個很復雜的規范,可以從不同的角度來解釋,本質上我們可以理解成JAVA內存模型規范了JVM如何按需禁用緩存和禁用指令重排。

具體來說這些方法包括 volatile、synchronized 和 final 等關鍵字,以及六項 Happens-Before 規則。

volatile不是JAVA獨有的關鍵字,它最開始的含義就是禁用CPU緩存,JAVA1.5之后對它進行了語義加強,就是引入了一套Happens-Before 規則。

例如下面的代碼:

class VolatileExample { int x = 0; volatile boolean v = false; public void writer() { x = 42; v = true; } public void reader() { if (v == true) { // 這里 x 會是多少呢? } }}

假如線程A執行了writer方法,線程B執行reader方法,如果線程B發現了v=true,那么同時也會發現x=42。

Happens-Before 規則

接下來我們就來看看今天的主角,Happens-Before是什么?

Happens-Before要表達的是:前面一個操作的結果對后續操作是可見的,它約束了編譯器的優化行為,雖允許編譯器優化導致的指令重排,但是要求編譯器優化后一定遵守 Happens-Before 規則。

都說Happens-Before對于JAVA內存模型來講是一個比較晦澀難懂的部分,但我們一點一點來剖析,其實沒那么難理解。

程序的順序性規則

這條規則是指在一個線程中,按照程序順序,前面的操作 Happens-Before 于后續的任意操作。

這條規則還是比較容易理解的,就是保證了單線程中程序的順序性。

volatile變量規則

這條規則是指對一個 volatile 變量的寫操作, Happens-Before 于后續對這個 volatile 變量的讀操作。

這么看的話,是不是發現其實它就是禁用CPU緩存的意思,多線程下保證變量的可見性。

傳遞性

這條規則是指如果 A Happens-Before B,且 B Happens-Before C,那么 A Happens-Before C。

這個傳遞性也很好理解,那么假如把傳遞性和volatile變量規則放在一起會發生什么呢?

就比如我們上文中的代碼,x=42 Happens-Before v=true,寫變量v=true Happens-Before 讀變量v,那么根據傳遞性規則,x=42 Happens-Before 讀變量v。

所以我們之前分析,如果線程B讀變量v=true,那么x=42對于線程B也是可見的。

并發工具包(java.util.concurrent)就是靠 volatile 語義來搞定可見性的,同時傳遞性也是對volatile關鍵字的增強,保證了可見性的同時也保證了有序性。

管程中鎖的規則

這條規則是指對一個鎖的解鎖 Happens-Before 于后續對這個鎖的加鎖。

這條規則其實也很容易理解,不加鎖何來解鎖一說。

線程start()規則

這條是關于線程啟動的。它是指主線程 A 啟動子線程 B 后,子線程 B 能夠看到主線程在啟動子線程 B 前的操作。

這條規則也沒什么好解釋的,就是字面意思。

線程join()規則

這條是關于線程等待的。它是指主線程 A 等待子線程 B 完成(主線程 A 通過調用子線程 B 的 join() 方法實現),當子線程 B 完成后(主線程 A 中 join() 方法返回),主線程能夠看到子線程的操作。當然所謂的“看到”,指的是對共享變量的操作。

總結

Java 的內存模型是并發編程領域的一次重要創新,它主要分為兩部分,一部分面向編寫并發程序的應用開發人員,另一部分是面向 JVM 的實現人員的。

我們在并發專欄中理解前者就可以了。

到此這篇關于JAVA內存模型和Happens-Before規則知識點講解的文章就介紹到這了,更多相關淺談JAVA內存模型和Happens-Before規則內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 服务器之家 - 专注于服务器技术及软件下载分享 | 上海律师咨询_上海法律在线咨询免费_找对口律师上策法网-策法网 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 室内室外厚型|超薄型|非膨胀型钢结构防火涂料_隧道专用防火涂料厂家|电话|价格|批发|施工 | 上海公司注册-代理记账-招投标审计-上海昆仑扇财税咨询有限公司 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 车载加油机品牌_ 柴油加油机厂家| 恒温振荡混匀器-微孔板振荡器厂家-多管涡旋混匀器厂家-合肥艾本森(www.17world.net) | 恒温槽_恒温水槽_恒温水浴槽-上海方瑞仪器有限公司 | 工业车间焊接-整体|集中除尘设备-激光|等离子切割机配套除尘-粉尘烟尘净化治理厂家-山东美蓝环保科技有限公司 | 口臭的治疗方法,口臭怎么办,怎么除口臭,口臭的原因-口臭治疗网 | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 | 石牌坊价格石牌坊雕刻制作_石雕牌坊牌楼石栏杆厂家_山东嘉祥石雕有限公司 | 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | 英超直播_英超免费在线高清直播_英超视频在线观看无插件-24直播网 | 网络推广公司_网络营销方案策划_企业网络推广外包平台-上海澜推网络 | 胶原检测试剂盒,弹性蛋白检测试剂盒,类克ELISA试剂盒,阿达木单抗ELISA试剂盒-北京群晓科苑生物技术有限公司 | 洁净棚-洁净工作棚-无菌室-净化工程公司_北京卫护科技有限公司 | 智能终端_RTU_dcm_北斗星空自动化科技 | 超声波焊接机,振动摩擦焊接机,激光塑料焊接机,超声波焊接模具工装-德召尼克(常州)焊接科技有限公司 | 呼末二氧化碳|ETCO2模块采样管_气体干燥管_气体过滤器-湖南纳雄医疗器械有限公司 | 汽车整车综合环境舱_军标砂尘_盐雾试验室试验箱-无锡苏南试验设备有限公司 | 液氮罐_液氮容器_自增压液氮罐_杜瓦瓶_班德液氮罐厂家 | 土壤有机碳消解器-石油|表层油类分析采水器-青岛溯源环保设备有限公司 | 上海小程序开发-小程序制作-上海小程序定制开发公司-微信商城小程序-上海咏熠 | 广东佛电电器有限公司|防雷开关|故障电弧断路器|智能量测断路器 广东西屋电气有限公司-广东西屋电气有限公司 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | 搜木网 - 木业全产业链交易平台,免费搜货、低价买货! | 飞利浦LED体育场灯具-吸顶式油站灯-飞利浦LED罩棚灯-佛山嘉耀照明有限公司 | 一体化污水处理设备_生活污水处理设备_全自动加药装置厂家-明基环保 | 全自动不干胶贴标机_套标机-上海今昂贴标机生产厂家 | 精密冲床,高速冲床等冲压设备生产商-常州晋志德压力机厂 | 钢托盘,铁托盘,钢制托盘,镀锌托盘,饲料托盘,钢托盘制造商-南京飞天金属13260753852 | 钢托盘,钢制托盘,立库钢托盘,金属托盘制造商_南京飞天金属制品实业有限公司 | 香港新时代国际美容美发化妆美甲培训学校-26年培训经验,值得信赖! | RO反渗透设备_厂家_价格_河南郑州江宇环保科技有限公司 | 阻燃剂-氢氧化镁-氢氧化铝-沥青阻燃剂-合肥皖燃新材料 | 数控走心机-双主轴走心机厂家-南京建克 | 板材品牌-中国胶合板行业十大品牌-环保板材-上海声达板材 | 酒万铺-酒水招商-酒水代理| 螺旋压榨机-刮泥机-潜水搅拌机-电动泥斗-潜水推流器-南京格林兰环保设备有限公司 | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! |