大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java從入門到項目實踐:Java內存模型JMM

Java從入門到項目實踐:Java內存模型JMM

更新時間:2020-08-10 15:23:28 來源:動力節點 瀏覽2130次

Java內存模型JMM基礎知識及原理,學習過程中需要了解內存模型抽象結構、共享變量、JMM抽象結構模型、主內存與工作內存的相關知識,Java內存模型具有原子性、可見性、有序性三大特征。

java從入門到項目實踐

一、內存模型抽象結構

線程間協作通信可以類比人與人之間的協作的方式,在現實生活中,之前網上有個流行語“你媽喊你回家吃飯了”,就以這個生活場景為例,小明在外面玩耍,小明媽媽在家里做飯,做完飯后準備叫小明回家吃飯,那么就存在兩種方式:

小明媽媽要去上班了十分緊急這個時候手機又沒有電了,于是就在桌子上貼了一張紙條“飯做好了,放在…”小明回家后看到紙條如愿吃到媽媽做的飯菜,那么,如果將小明媽媽和小明作為兩個線程,那么這張紙條就是這兩個線程間通信的共享變量,通過讀寫共享變量實現兩個線程間協作;

還有一種方式就是,媽媽的手機還有電,媽媽在趕去坐公交的路上給小明打了個電話,這種方式就是通知機制來完成協作。同樣,可以引申到線程間通信機制。

通過上面這個例子,應該有些認識。在并發編程中主要需要解決兩個問題:1.線程之間如何通信;2.線程之間如何完成同步。通信是指線程之間以何種機制來交換信息,主要有兩種:共享內存和消息傳遞。可以分別類比上面的兩個舉例。Java內存模型是共享內存的并發模型,線程之間主要通過讀-寫共享變量來完成隱式通信。如果程序員不能理解Java的共享內存模型在編寫并發程序時一定會遇到各種各樣關于內存可見性的問題。

二、共享變量

在Java程序中所有實例域,靜態域和數組元素都是放在堆內存中(所有線程均可訪問到,是可以共享的),而局部變量,方法定義參數和異常處理器參數不會在線程間共享。共享數據會出現線程安全的問題,而非共享數據不會出現線程安全的問題。

三、JMM抽象結構模型

CPU的處理速度和主存的讀寫速度不是一個量級的(CPU的處理速度快很多),為了平衡這種巨大的差距,每個CPU都會有緩存。因此,共享變量會先放在主存中,每個線程都有屬于自己的工作內存,并且會把位于主存中的共享變量拷貝到自己的工作內存,之后的讀寫操作均使用位于工作內存的變量副本,并在某個時刻將工作內存的變量副本寫回到主存中去。JMM就從抽象層次定義了這種方式,并且JMM決定了一個線程對共享變量的寫入何時對其他線程是可見的。

java從入門到項目實踐

如圖為JMM抽象示意圖,線程A和線程B之間要完成通信的話,要經歷如下兩步:

線程A從主內存中將共享變量讀入線程A的工作內存后并進行操作,之后將數據重新寫回到主內存中;線程B從主存中讀取最新的共享變量。

從橫向去看看,線程A和線程B就好像通過共享變量在進行隱式通信。這其中有個意思的問題,如果線程A更新后數據并沒有及時寫回到主存,而此時線程B讀到的是過期的數據,這就出現了“臟讀”現象。可以通過同步機制來解決或者通過volatile關鍵字使得每次volatile變量都能夠強制刷新到主存,從而對每個線程都是可見的。

四、主內存與工作內存

處理器上的寄存器的讀寫的速度比內存快幾個數量級,為了解決這種速度矛盾,在它們之間加入了高速緩存。加入高速緩存帶來了一個新的問題:緩存一致性。如果多個緩存共享同一塊主內存區域,那么多個緩存的數據可能會不一致,需要一些協議來解決這個問題。

java從入門到項目實踐

所有的變量都存儲在主內存中,每個線程還有自己的工作內存,工作內存存儲在高速緩存或者寄存器中,保存了該線程使用的變量的主內存副本拷貝。

線程只能直接操作工作內存中的變量,不同線程之間的變量值傳遞需要通過主內存來完成。

五、內存間交互操作

Java內存模型定義了8個操作來完成主內存和工作內存的交互操作。

java從入門到項目實踐

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

unlock(解鎖):作用于主內存中的變量,它把一個處于鎖定狀態的變量釋放出來,釋放后的變量才可以被其他線程鎖定

read(讀取):作用于主內存的變量,它把一個變量的值從主內存傳輸到線程的工作內存中,以便后面的load動作使用;

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

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

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

store(存儲):作用于工作內存的變量,它把工作內存中一個變量的值傳送給主內存中以便隨后的write操作使用;

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

以上就是動力節點java培訓機構的小編針對“Java從入門到項目實踐:Java內存模型JMM”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产探花在线观看 | 久久成人国产精品 | 欧美性精品hd在线观看 | 久久99热久久精品99 | 精品久久一区二区三区 | 天天拍拍夜夜出水 | 夜夜操天天干 | 天天干天天射天天爽 | 久久久高清日本道免费观看 | 亚洲 在线播放 | 91亚洲精品国产第一区 | 奇米色影院 | 欧美日韩国产三级 | 99视频国产在线 | 欧美日韩午夜视频 | 久久久91| 日韩在线网 | 美女美女高清毛片视频 | 久草视频资源在线 | 国产精品入口麻豆午夜 | 欧美freesex10一|3 | 欧美韩日在线 | 四虎网址在线观看 | 亚洲国产高清视频 | 国产午夜不卡 | 国产一区免费观看 | 久久精品综合网 | 国产精品久久久 | 九七97影院理论片手机在线观看 | 亚洲国产一区二区三区四区 | 国产精品欧美日韩视频一区 | 日本特黄a级高清免费大片18 | 91蝌蚪在线播放 | 深夜色 | 四虎影院紧急入口 | 亚洲 欧美 综合 | 色综合久久久久久久 | 亚洲美女视频网站 | 欧美中文网 | 国产精品日韩欧美一区二区 | 看片亚洲 |