成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java內存模型詳解

開發 后端
本文向您介紹Java內存模型的概念,在C或C++中, 利用不同操作平臺下的內存模型來編寫并發程序;Java利用了自身虛擬機的優勢, 使內存模型不束縛于具體的處理器架構,真正實現了跨平臺。

內存模型 (memory model)

內存模型描述的是程序中各變量(實例域、靜態域和數組元素)之間的關系,以及在實際計算機系統中將變量存儲到內存和從內存取出變量這樣的低層細節.

不同平臺間的處理器架構將直接影響內存模型的結構.

在C或C++中, 可以利用不同操作平臺下的內存模型來編寫并發程序. 但是, 這帶給開發人員的是, 更高的學習成本.相比之下, Java利用了自身虛擬機的優勢, 使內存模型不束縛于具體的處理器架構, 通過Java內存模型真正實現了跨平臺.(針對hotspot jvm, jrockit等不同的jvm, 內存模型也會不相同)

內存模型的特征:

a, Visibility 可視性 (多核,多線程間數據的共享)

b, Ordering 有序性 (對內存進行的操作應該是有序的)


Java內存模型 ( java memory model )

根據Java Language Specification中的說明, jvm系統中存在一個主內存(Main Memory或Java Heap Memory),Java中所有變量都儲存在主存中,對于所有線程都是共享的。

每條線程都有自己的工作內存(Working Memory),工作內存中保存的是主存中某些變量的拷貝,線程對所有變量的操作都是在工作內存中進行,線程之間無法相互直接訪問,變量傳遞均需要通過主存完成。

Java內存模型

其中, 工作內存里的變量, 在多核處理器下, 將大部分儲存于處理器高速緩存中, 高速緩存在不經過內存時, 也是不可見的.

jmm怎么體現可視性(Visibility) ?

在jmm中, 通過并發線程修改變量值, 必須將線程變量同步回主存后, 其他線程才能訪問到.

jmm怎么體現有序性(Ordering) ?

通過Java提供的同步機制或volatile關鍵字, 來保證內存的訪問順序.

緩存一致性(cache coherency

什么是緩存一致性?

它是一種管理多處理器系統的高速緩存區結構,其可以保證數據在高速緩存區到內存的傳輸中不會丟失或重復。(來自wikipedia)

舉例理解:

假如有一個處理器有一個更新了的變量值位于其緩存中,但還沒有被寫入主內存,這樣別的處理器就可能會看不到這個更新的值.

解決緩存一致性的方法?

a, 順序一致性模型:

要求某處理器對所改變的變量值立即進行傳播, 并確保該值被所有處理器接受后, 才能繼續執行其他指令.

b, 釋放一致性模型: (類似jmm cache coherency)

允許處理器將改變的變量值延遲到釋放鎖時才進行傳播.

Java內存模型的緩存一致性模型 - "happens-before ordering(先行發生排序)"

一般情況下的示例程序:

  1. x = 0;  
  2. y = 0;  
  3. i = 0;  
  4. j = 0;  
  5.  
  6. // thread A  
  7. y = 1;  
  8. x = 1;  
  9.  
  10. // thread B  
  11. i = x;  
  12. j = y; 

在如上程序中, 如果線程A,B在無保障情況下運行, 那么i,j各會是什么值呢?

答案是, 不確定. (00,01,10,11都有可能出現),這里沒有使用Java同步機制, 所以Java內存模型有序性和可視性都無法得到保障. happens-before ordering( 先行發生排序) 如何避免這種情況? 排序原則已經做到:
 
a, 在程序順序中, 線程中的每一個操作, 發生在當前操作后面將要出現的每一個操作之前.

b, 對象監視器的解鎖發生在等待獲取對象鎖的線程之前.

c, 對volitile關鍵字修飾的變量寫入操作, 發生在對該變量的讀取之前.

d, 對一個線程的 Thread.start() 調用 發生在啟動的線程中的所有操作之前.

e, 線程中的所有操作 發生在從這個線程的 Thread.join()成功返回的所有其他線程之前.

為了實現 happends-before ordering原則, Java及JDK提供的工具:

a, synchronized關鍵字

b, volatile關鍵字

c, final變量

d, java.util.concurrent.locks包(since jdk 1.5)

e, java.util.concurrent.atmoic包(since jdk 1.5)

使用了happens-before ordering的例子:

happens-before ordering的例子

 1) 獲取對象監視器的鎖(lock)

(2) 清空工作內存數據, 從主存復制變量到當前工作內存, 即同步數據 (read and load)

(3) 執行代碼,改變共享變量值 (use and assign)

(4) 將工作內存數據刷回主存 (store and write)

(5) 釋放對象監視器的鎖 (unlock)

注意: 其中4,5兩步是同時進行的.

這邊最核心的就是第二步, 他同步了主內存,即前一個線程對變量改動的結果,可以被當前線程獲知!(利用了happens-before ordering原則)

對比之前的例子

如果多個線程同時執行一段未經鎖保護的代碼段,很有可能某條線程已經改動了變量的值,但是其他線程卻無法看到這個改動,依然在舊的變量值上進行運算,最終導致不可預料的運算結果。

 

【編輯推薦】

  1. Java與.NET的WebServices相互調用
  2. 在Java中實現DOM文檔和XML文件互相轉換
  3. Java垃圾回收機制淺析
  4. Java基礎教程之事件和監聽器
  5. Java類中域和方法設置中的常見錯誤
責任編輯:佚名 來源: CSDN
相關推薦

2025-06-06 06:25:07

2010-09-25 12:38:40

JVM內存模型

2018-07-04 14:43:55

對象模型內存結構內存模型

2018-08-09 11:06:39

Apache Spar內存模型

2021-05-06 19:20:05

Java內存模型

2022-02-04 22:05:19

JVM程序內存模型

2023-07-11 08:43:43

volatileJava內存

2018-11-01 10:34:37

JVM內存配置

2021-04-25 06:12:19

Java內存布局JVM

2019-11-08 15:11:03

Java架構數據

2024-11-18 16:37:35

JMMJava內存模型

2018-05-18 09:07:43

Linux內核內存

2024-03-26 00:33:59

JVM內存對象

2015-08-21 09:56:17

Java內存分析MAT使用

2018-12-18 14:08:01

Java內存volatile

2013-07-11 10:37:20

Java內存模型

2022-07-07 08:00:51

Java內存模型

2020-12-07 06:23:48

Java內存

2025-03-04 10:45:19

JVM內存模型Java

2016-09-26 17:09:28

Java并發編程內存模型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99久久精品国产一区二区三区 | 91久久精品国产91久久性色tv | 久久久久久久av | 久久久久国产精品 | 国产真实精品久久二三区 | 欧美日韩一区二区三区在线观看 | 亚洲精品中文在线观看 | 亚洲精品中文字幕在线 | 在线免费观看色 | 国产成人99久久亚洲综合精品 | 一本大道久久a久久精二百 国产成人免费在线 | 午夜av电影| 中文字幕在线不卡播放 | 欧美国产精品久久久 | 欧美成人精品二区三区99精品 | 国产精品久久久久久婷婷天堂 | 亚洲综合视频一区 | 99精品国产一区二区三区 | 91免费在线 | 欧美精品福利视频 | 狠狠躁躁夜夜躁波多野结依 | 99re6在线 | 欧美成人性生活 | av片免费观看 | 91精品欧美久久久久久久 | 一区二区在线观看av | 五月免费视频 | 亚洲精品乱码8久久久久久日本 | 欧美久久一区二区三区 | 草久网 | 日韩av免费在线电影 | 日韩精品一二三 | 欧美一二三 | 国产成人精品网站 | 国产精品一区二区不卡 | 在线第一页 | 一级毛片视频在线 | 黄色一级大片在线观看 | 免费一看一级毛片 | www国产成人 | 国产精品成人一区二区三区 |