JAVA 內存模型 (Java Memory Model,JMM)

JAVA內存模型

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

Java內存模型(Java Memory Model,JMM)

是在硬件內存模型基礎上更高層的抽象,它屏蔽了各種硬件和操作系統對內存訪問的差異性,從而實現讓Java程序在各種平臺下都能達到一致的并發效果。

主內存與工作內存:

除了主內存,每條線程還有自己的工作內存,此處可與CPU的高速緩存進行類比。

工作內存中保存著該線程使用到的變量的主內存副本的拷貝,線程對變量的操作都必須在工作內存中進行,包括讀取和賦值等,而不能直接讀寫主內存中的變量。

不同的線程之間也無法直接訪問對方工作內存中的變量,線程間變量值的傳遞必須通過主內存來完成。

內存間的交互操作:

關于主內存與工作內存之間具體的交互協議,Java內存模型定義了以下8種具體的操作來完成:

(1)lock,鎖定,作用于主內存的變量,它把主內存中的變量標識為一條線程獨占狀態;

(2)unlock,解鎖,作用于主內存的變量,它把鎖定的變量釋放出來,釋放出來的變量才可以被其它線程鎖定;

(3)read,讀取,作用于主內存的變量,它把一個變量從主內存傳輸到工作內存中,以便后續的load操作使用;

(4)load,載入,作用于工作內存的變量,它把read操作從主內存得到的變量放入工作內存的變量副本中;

(5)use,使用,作用于工作內存的變量,它把工作內存中的一個變量傳遞給執行引擎,每當虛擬機遇到一個需要使用到變量的值的字節碼指令時將會執行這個操作;

(6)assign,賦值,作用于工作內存的變量,它把一個從執行引擎接收到的變量賦值給工作內存的變量,每當虛擬機遇到一個給變量賦值的字節碼指令時使用這個操作;

(7)store,存儲,作用于工作內存的變量,它把工作內存中一個變量的值傳遞到主內存中,以便后續的write操作使用;

(8)write,寫入,作用于主內存的變量,它把store操作從工作內存得到的變量的值放入到主內存的變量中;

如果要把一個變量從主內存復制到工作內存,那就要按順序地執行read和load操作,同樣地,如果要把一個變量從工作內存同步回主內存,就要按順序地執行store和write操作。

注意,這里只說明了要按順序,并沒有說一定要連續,也就是說可以在read與load之間、store與write之間插入其它操作。

執行上述8種操作的基本規則:

(1)不允許read和load、store和write操作之一單獨出現,即不允許出現從主內存讀取了而工作內存不接受,或者從工作內存回寫了但主內存不接受的情況出現;

(2)不允許一個線程丟棄它最近的assign操作,即變量在工作內存變化了必須把該變化同步回主內存;

(3)不允許一個線程無原因地(即未發生過assign操作)把一個變量從工作內存同步回主內存;

(4)一個新的變量必須在主內存中誕生,不允許工作內存中直接使用一個未被初始化(load或assign)過的變量,換句話說就是對一個變量的use和store操作之前必須執行過load和assign操作;

(5)一個變量同一時刻只允許一條線程對其進行lock操作,但lock操作可以被同一個線程執行多次,多次執行lock后,只有執行相同次數的unlock操作,變量才能被解鎖。

(6)如果對一個變量執行lock操作,將會清空工作內存中此變量的值,在執行引擎使用這個變量前,需要重新執行load或assign操作初始化變量的值;

(7)如果一個變量沒有被lock操作鎖定,則不允許對其執行unlock操作,也不允許unlock一個其它線程鎖定的變量;

(8)對一個變量執行unlock操作之前,必須先把此變量同步回主內存中,即執行store和write操作;

注意,這里的lock和unlock是實現synchronized的基礎,Java并沒有把lock和unlock操作直接開放給用戶使用,但是卻提供了兩個更高層次的指令來隱式地使用這兩個操作,即moniterenter和moniterexit。

原子性、可見性、有序性:

Java內存模型就是為了解決多線程環境下共享變量的一致性問題。

一致性主要包含三大特性:原子性、可見性、有序性,下面我們就來看看Java內存模型是怎么實現這三大特性的。

(1)原子性

原子性是指一段操作一旦開始就會一直運行到底,中間不會被其它線程打斷,這段操作可以是一個操作,也可以是多個操作。

由Java內存模型來直接保證的原子性操作包括read、load、user、assign、store、write這兩個操作,我們可以大致認為基本類型變量的讀寫是具備原子性的。

如果應用需要一個更大范圍的原子性,Java內存模型還提供了lock和unlock這兩個操作來滿足這種需求,盡管不能直接使用這兩個操作,但我們可以使用它們更具體的實現synchronized來實現。

因此,synchronized塊之間的操作也是原子性的。

(2)可見性

可見性是指當一個線程修改了共享變量的值,其它線程能立即感知到這種變化。

Java內存模型是通過在變更修改后同步回主內存,在變量讀取前從主內存刷新變量值來實現的,它是依賴主內存的,無論是普通變量還是volatile變量都是如此。

普通變量與volatile變量的主要區別是是否會在修改之后立即同步回主內存,以及是否在每次讀取前立即從主內存刷新。因此我們可以說volatile變量保證了多線程環境下變量的可見性,但普通變量不能保證這一點。

除了volatile之外,還有兩個關鍵字也可以保證可見性,它們是synchronized和final。

synchronized的可見性是由“對一個變量執行unlock操作之前,必須先把此變量同步回主內存中,即執行store和write操作”這條規則獲取的。

final的可見性是指被final修飾的字段在構造器中一旦被初始化完成,那么其它線程中就能看見這個final字段了。

(3)有序性

Java程序中天然的有序性可以總結為一句話:如果在本線程中觀察,所有的操作都是有序的;如果在另一個線程中觀察,所有的操作都是無序的。

前半句是指線程內表現為串行的語義,后半句是指“指令重排序”現象和“工作內存和主內存同步延遲”現象。

Java中提供了volatile和synchronized兩個關鍵字來保證有序性。

volatile天然就具有有序性,因為其禁止重排序。

synchronized的有序性是由“一個變量同一時刻只允許一條線程對其進行lock操作”這條規則獲取的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447452.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447452.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447452.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 報錯如下: java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.…

解決:Command line is too long. In order to reduce its length classpath file can be used.

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 原本可以正常運行的項目,突然出現這個錯: Command line is too long. In order to reduce its length class…

性能提升利器之固態硬盤和序列化漫談

摘要:假設我們已經構建了下一個殺手級應用,而且變得越來越受歡迎,突破負載極限,以我們目前的增長的速度,需要在3個月內將需要將性能提升10倍。我們該怎么做? 【編者按】當面對一個性能擴展問題時&#xff…

查看本機IP的方法

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 打開網絡和共享中心 2.更改適配器設置 3. 右鍵選擇 狀態 4.選擇詳情 5.找到IP

來自前蘋果高管Heidi Roizen的經驗之談

摘要:Heidi Roizen曾是T/Maker的聯合創始人兼CEO;此后Heidi Roizen加入蘋果公司擔任開發者關系的高級副總裁。本文她分享了8條箴言,希望能為各位開發者帶來啟迪,體會生活與工作上的人生感悟。 【編者按】Heidi Roizen曾是T/Maker的…

解決:Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408,

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1.只是想啟動elasticsearch,報錯如題: Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c…

Docker CEO Ben Golub:Docker借助開源、天時走向成功

摘要:Docker CEO Ben Golub接受了Gigaom專訪,他表示,Docker正是借助開源、天時走向了成功。而作為Docker前身,現任CTO Hykes在運作dotCloud過程中,發現多平臺的需求越來越受到用戶關注,于是Docker孕育而生。…

linux系統/opt目錄和/usr/local目錄有什么區別

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 在學習linux的時候,看到/opt目錄和/usr/local目錄都是安裝軟件的目錄,那這兩個目錄有什么區別呢? 一…

果斷Mark!Searchcode——源代碼搜索利器

摘要:Searchcode是一款免費的源代碼/文檔搜索引擎,匯聚Github、Codeplex、Sourceforge等多家開源站點,擁有超過20萬個項目、180億行源代碼,能以特殊字符、語言、倉庫和源方式從90多種語言找到函數、API的真實代碼。 Searchcode是…

elasticsearch 安裝( 阿里云ECS )、遠程訪問、啟動報錯處理

附另 2 文章: elasticsearch-head 安裝 kibana 安裝 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 從網上下載到 linux 版本的 tar 包:elasticsearch-6.7.…

解決:git: command not found、apt-get: command not found、git 安裝

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 運行 git 失敗,因為沒有安裝 git。 于是就安裝:apt-get install git,于是得到后一個報錯。 原來 a…

為什么程序員要盡量少寫代碼

軟件開發的一個最基本的事實是寫代碼,但是最大的誤區之一就是把寫代碼當做工作。當我作為一個程序員第一次參加工作的時候,就犯了這樣的錯誤。老實說,寫代碼真的是一件特有意思的事,它的強大功能,它的多種作用等等都讓…

elasticsearch-head 安裝

elasticsearch 安裝( 阿里云ECS )、遠程訪問、啟動報錯處理 kibana 安裝 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 首先安裝好 git、node.js、npm、cnpm yum -y install g…

C語言探秘:C代碼在內存中的分布

估計會有很多初學者跟我有一樣的疑惑,這些編寫好的代碼是放在磁盤中,但是運行將會被copy至內存中去運行。但他們在內存中是怎么分布呢。在 “linux下c編程圣經”(apue)UNIX環境高級編程一書中闡述了這一點。在這里結合網上資料以及…

集合:按元素的中文屬性排序

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 要排序的元素類&#xff1a; public static class NameCount implements Comparable<NameCount> {Collator collator Collato…

kibana 安裝

附另 2 文章&#xff1a; elasticsearch-head 安裝 elasticsearch 安裝( 阿里云ECS )、遠程訪問、啟動報錯處理 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我的 elasticsearch 是…

linux jps 命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 jps -- Java Virtual Machine Process Status Tool 可以列出本機所有java進程的pid jps [ options ] [ hostid ] 選項 -q 僅輸出…

“4K”時代將來臨!標準/技術一網打盡

第1頁&#xff1a;4K 分辨率與 DCI 數字電影院在今年的 CES&#xff08;電子消費大展&#xff09;上&#xff0c;除了讓人眼花繚亂新手機等移動設備外&#xff0c;還有一個領域讓人感到相當矚目&#xff0c;這就是所謂的 4K 電視產品。 4K 電視的賣點當然是高分辨率&#xff0c…

解決:Error while compiling statement: FAILED: SemanticException [Error 10007]: Ambiguous column refere

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.報錯&#xff1a; Error while compiling statement: FAILED: SemanticException [Error 10007]: Ambiguous column reference creat…

解決:which: no java in (/root/chengxu/maven/apache-maven-3.5.2/bin:/usr/local/sbin:/usr/local/bin:/usr

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯&#xff1a; which: no java in (/root/chengxu/maven/apache-maven-3.5.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/…