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

Java 內存模型,或許應該這么理解

開發(fā) 前端
我們從硬件、操作系統(tǒng)再到語言層面,知道了 Java 內存模型誕生的原因,知道其誕生就是為了解決多平臺的內存模型統(tǒng)一問題,進一步其實就是多線程的數(shù)據(jù)一致性問題。

今天,就樹哥一起與你一起重溫下這幾個知識點的聯(lián)系與理解吧。

Java 內存模型

網上關于 Java 內存模型的內容特別多,很多都講到了多 CPU 與緩存的數(shù)據(jù)一致性問題,于是順帶牽出了 MESI 等緩存一致性協(xié)議。其實到這里都沒問題,都挺有邏輯的。

但接下來為啥有 Java 內存模型?為啥又有 happens-before 原則?這些內容基本上沒有一個說得清楚,這就讓人很困惑了。此外,有些還扯出了內存屏障、執(zhí)行時序的問題,但都沒啥邏輯,聽起來亂糟糟的。我就曾專門花了一個晚上認真看某篇很火的文章,但最終也沒搞懂。

對于 Java 內存模型,我舍棄了一些不必要的細碎點,整理了我的一些理解,我感覺相對來說還是比較好理解的。

首先,由于多核 CPU 和高速緩存在存在,導致了緩存一致性問題。 這個問題屬于硬件層面上的問題,而解決辦法是各種緩存一致性協(xié)議。不同 CPU 采用的協(xié)議不同,MESI 是最經典的一個緩存一致性協(xié)議。

其次,操作系統(tǒng)作為對底層硬件的抽象,自然也需要解決 CPU 高速緩存與內存之間的緩存一致性問題。 各個操作系統(tǒng)都對 CPU 高速緩存與緩存的讀寫訪問過程進行抽象,最終得到的一個東西就是「內存模型」。

從硬件到操作系統(tǒng),這個是我自己的理解,我并沒有找到一些資料提到這點。但我覺得這應該是沒有錯的。因為操作系統(tǒng)就是對底層硬件的抽象,而所有抽象的東西就需要定義一些概念。

對于操作系統(tǒng)來說,這些概念就是內存模型、CPU 時間片等。內存模型這個詞,在操作系統(tǒng)的教科書上也是可以找到的,這也是一個佐證吧。

于是,我們從硬件層面理解到了操作系統(tǒng)層面,但這跟 Java 內存模型有啥關系呢?

最后,Java 語言作為運行在操作系統(tǒng)層面的高級語言,為了解決多平臺運行的問題,在操作系統(tǒng)基礎上進一步抽象,得到了 Java 語言層面上的內存模型,其也是為了解決多線程情況下的數(shù)據(jù)一致性問題。

我們是因為要實現(xiàn) Java 語言的「Write Once, Run Anywhere」的理念,那么就必須解決多平臺內存模型不一致的問題,這樣才創(chuàng)造出了 Java 內存模型。

Java 內存模型規(guī)定了很多規(guī)則,如果 Java 程序能夠遵守 Java 內存模型的規(guī)則,那么其寫出的程序就是并發(fā)安全的,這就是 Java 內存模型最大的價值。

到這里,我們從硬件、操作系統(tǒng)再到語言層面,知道了 Java 內存模型誕生的原因,知道其誕生就是為了解決多平臺的內存模型統(tǒng)一問題,進一步其實就是多線程的數(shù)據(jù)一致性問題。

happens-before 原則

前面說到,為了解決多平臺的內存模型統(tǒng)一,以及多線程的數(shù)據(jù)一致性問題,所以有了 Java 內存模型。但是 Java 內存模型的內容太多了,基本就記不住,非常不利于編程人員理解,所以才有了 happens-before 原則。

所以說 happens-before 原則是對 Java 內存模型的簡化,讓我們更好地寫出并發(fā)代碼。

volatile 關鍵字

volatile 關鍵字,其實也與 Java 內存模型有關系,只是很多文章都沒說清楚。

volatile 關鍵字有兩個作用,就是可見性和禁止指令重排序。但為啥它有這兩個作用呢?其實 volatile 這兩個作用的來源,就來自于 Java 內存模型里對 volatile 變量定義的特殊規(guī)則。

這就是 volatile 關鍵字與 Java 內存模型的關系,比較簡單。

至于內存屏障這個詞,其實就是一個讓我們方便理解的名詞,誕生于 volatile 禁止指令重排序這個作用里,也沒啥不好理解的。

synchronized 關鍵字

synchronized 關鍵字,也是并發(fā)編程常用到的內容,其實它和 Java 內存模型沒關系,但和 Java 虛擬機規(guī)范有關系。

synchronized 關鍵字經過編譯之后,會在同步塊的前后分別形成 monitorenter 和 monitorexit 這兩個字節(jié)碼指令,這兩個字節(jié)碼的執(zhí)行需要指明一個要鎖定或解鎖的對象。

而 monitorenter 和 monitorexit 這兩個字節(jié)碼指令為啥能實現(xiàn)這樣的功能,是因為 Java 虛擬機中做了強制定義,那么虛擬機就需要實現(xiàn)。

synchronized 關鍵字與 Java 對象的內存布局,也是有關系的。自旋鎖、自適應鎖、偏向鎖,它們靠什么實現(xiàn),就是 Java 對象中的對象頭去判斷,然后進行一系列的邏輯操作。

總結

至此,我們基本上可以把 Java 并發(fā)編程里常見的那些概念的關系搞清楚了。

Java 內存模型 是對內存布局的抽象,解決多平臺運行以及多線程一致性的問題。 happens-before 原則 是 Java 內存模型定義的簡化,方便我們學習。 volatile 則是輕量級同步同步機制,其來源于 Java 內存模型賦予的權利。

synchronized 關鍵字的合法性,則來自于 Java 虛擬機規(guī)范。而 synchronized 中自旋鎖、自適應鎖、偏向鎖等,都依靠 Java 對象的對象頭 來判斷。

以上就是我對 Java 并發(fā)編程里常見概念的理解,感覺還是比較清晰一些。

責任編輯:武曉燕 來源: 陳樹義
相關推薦

2013-07-11 10:37:20

Java內存模型

2018-11-20 09:37:19

Java內存模型

2023-11-05 12:05:35

JVM內存

2020-02-19 08:48:04

Java內存模型CPU

2015-03-24 13:28:52

Java Java Strin內存模型

2022-06-22 08:02:11

CPU操作系統(tǒng)Java

2020-11-11 08:45:48

Java

2018-07-04 14:43:55

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

2022-08-14 14:49:29

區(qū)塊鏈醫(yī)療記錄信息安全

2009-06-24 16:50:11

Java內存模型

2015-08-27 09:12:58

大數(shù)據(jù)

2010-03-08 14:21:59

數(shù)據(jù)中心

2021-01-12 14:21:09

云原生云計算技術

2023-10-27 07:47:58

Java語言順序性

2021-09-08 17:42:45

JVM內存模型

2020-05-26 12:32:30

Python模板語言編程語言

2018-10-31 15:44:31

2023-01-28 08:04:08

AOPSpring框架

2022-04-20 08:30:05

技術業(yè)務服務

2024-11-18 16:37:35

JMMJava內存模型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠久 | 国产精品欧美一区二区三区不卡 | 国产精品视频网 | 日本精品视频在线 | 中文av在线播放 | 成人精品一区亚洲午夜久久久 | 国产精品99久久久久久宅男 | 国产色黄 | 911网站大全在线观看 | 国产一区在线视频 | 日韩精品一区二区三区 | 日本不卡一区二区三区 | 毛片.com | 久久久精品网站 | 欧美激情一区二区 | 国产一区二区三区四区五区3d | 天天综合日日夜夜 | 亚洲精品一二区 | 一区二区三区国产精品 | 五月天激情综合网 | 国产小视频在线观看 | 日韩中文在线观看 | 精久久| 91国语清晰打电话对白 | 蜜桃免费一区二区三区 | 黄色毛片大全 | 一区影视 | 国产精品视频二区三区 | 国产精品99视频 | 九九热这里只有精品在线观看 | 一区二区视频 | 日日操夜夜干 | 日本不卡高字幕在线2019 | 日本一区二区三区精品视频 | 日韩成人免费av | 粉色午夜视频 | 毛片一级片 | av看片网站 | 亚洲最大av网站 | 91在线精品播放 | 亚洲激情一区二区三区 |