国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Java鎖(一)之內(nèi)存模型

2019-11-14 14:59:06
字體:
供稿:網(wǎng)友

  想要了解java鎖機(jī)制、引發(fā)的線程安全問題以及數(shù)據(jù)一致性問題,有必要了解內(nèi)存模型,機(jī)理機(jī)制了解清楚了,這些問題也就應(yīng)聲而解了。

一、主內(nèi)存和工作內(nèi)存

  Java內(nèi)存模型分為主內(nèi)存和工作內(nèi)存,所有的變量都存儲在主內(nèi)存中。每條線程還有自己的工作內(nèi)存,線程的工作內(nèi)存中保存了被該線程使用到變量的主內(nèi)存副本拷貝,線程對變量的所有操作都必須在工作內(nèi)存中進(jìn)行,而不能直接讀寫主內(nèi)存中的變量。不同的線程之間也無法直接訪問對方工作內(nèi)存中的變量,線程間變量值的傳遞均需要主內(nèi)存來完成。

二、線程、工作內(nèi)存和主內(nèi)存

  下面是java的內(nèi)存模型,(參見與java虛擬機(jī))

 

  實際上,不同平臺間的處理器架構(gòu)將直接影響內(nèi)存模型的結(jié)構(gòu)。

  在CC++可以利用不同操作平臺下的內(nèi)存模型來編寫并發(fā)程序但是這帶給開發(fā)人員的是更高的學(xué)習(xí)成本.相比之下, java利用了自身虛擬機(jī)的優(yōu)勢使內(nèi)存模型不束縛于具體的處理器架構(gòu)真正實現(xiàn)了跨平臺。(針對hotspot jvm, jrockit等不同的jvm, 內(nèi)存模型也會不相同)

內(nèi)存模型的特征

a, Visibility  可見性 (多核,多線程間數(shù)據(jù)的共享)

b, Ordering 有序性 (對內(nèi)存進(jìn)行的操作應(yīng)該是有序的)

 在jmm通過并發(fā)線程修改變量值必須將線程變量同步回主存后其他線程才能訪問到.來體現(xiàn)可視性(Visibility) 。通過java提供的同步機(jī)制或volatile關(guān)鍵字來保證內(nèi)存的訪問順序.

三、內(nèi)存間交互操作

Java內(nèi)存間操作包括8種操作:

① Lock

作用于主內(nèi)存的變量,把一個變量標(biāo)識為一個線程獨占的狀態(tài);

② Unlock

作用于主內(nèi)存的變量,把一個處于鎖定狀態(tài)的變量釋放出來;

③ Read

作用于主內(nèi)存的變量,把一個變量的值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存中,以便隨后的load的動作使用;

④ Load

作用于工作內(nèi)存中的變量,把read的操作從主內(nèi)存得到的變量值放入到工作內(nèi)存的變量的副本中;

⑤ Use

作用于工作內(nèi)存中的變量,把工作內(nèi)存中的變量傳遞給執(zhí)行引擎;

⑥ Assign

作用于工作內(nèi)存中的變量,把從執(zhí)行引擎?zhèn)鹘邮盏降淖兞抠x值給工作內(nèi)存中的變量;

⑦ Store

作用于工作內(nèi)存中的變量,把工作內(nèi)存中的變量傳送給主內(nèi)存中;

⑧ Write

作用于主內(nèi)存中的變量,把store操作的變量值放入主內(nèi)存的變量中。

上述操作中還要滿足如下原則:

1) Readload,以及storewrite不能單獨出現(xiàn);

2) Assign不能丟棄;

3) 不允許沒有assign操作的變量從線程的工作內(nèi)存中同步到主內(nèi)存;

4) Usestore的操作前必須assignload

5) Lockunlock成對出現(xiàn),對象才會解鎖;

6) 沒有lock的對象不能unlock

7) 執(zhí)行Lock操作的時候,將會清空工作內(nèi)存中此變量的值;

8) 執(zhí)行unlock之前,必須把此對象同步到主內(nèi)存中。

上面的論述初看起來有點迷糊,可以對照著模型圖進(jìn)行思考,就一目了然了。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 玛沁县| 崇礼县| 新竹市| 龙井市| 西宁市| 湖南省| 定结县| 都匀市| 湖州市| 延寿县| 卓尼县| 隆安县| 德惠市| 新干县| 湟中县| 平定县| 平和县| 纳雍县| 方正县| 炎陵县| 济阳县| 巴塘县| 兴安县| 桃江县| 汤阴县| 盐山县| 卓尼县| 蓬莱市| 铁岭市| 阳曲县| 庆城县| 蓬安县| 光山县| 察雅县| 龙胜| 阜新市| 赤水市| 晋州市| 唐山市| 新和县| 江孜县|