亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java內存模型以及鎖的內存語義

發布時間:2021-09-04 16:45:54 來源:億速云 閱讀:126 作者:chen 欄目:編程語言

這篇文章主要介紹“Java內存模型以及鎖的內存語義”,在日常操作中,相信很多人在Java內存模型以及鎖的內存語義問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java內存模型以及鎖的內存語義”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

【1】CPU和緩存的一致性

Java內存模型以及鎖的內存語義

我們應該都知道,計算機在執行程序的時候,每條指令都是在CPU中執行的,而執行的時候,又免不了要和數據打交道。而計算機上面的數據,是存放在主存當中的,也就是計算機的物理內存啦。

剛開始,還相安無事的,但是隨著CPU技術的發展,CPU的執行速度越來越快。而由于內存的技術并沒有太大的變化,所以從內存中讀取和寫入數據的過程和CPU的執行速度比起來差距就會越來越大,這就導致CPU每次操作內存都要耗費很多等待時間。

所以,人們想出來了一個好的辦法,就是在CPU和內存之間增加高速緩存。緩存的概念大家都知道,就是保存一份數據拷貝。他的特點是速度快,內存小,并且昂貴。

那么,程序的執行過程就變成了:

當程序在運行過程中,會將運算需要的數據從主存復制一份到CPU的高速緩存當中,那么CPU進行計算時就可以直接從它的高速緩存讀取數據和向其中寫入數據,當運算結束之后,再將高速緩存中的數據刷新到主存當中。

在CPU和主存之間增加緩存,在多線程場景下就可能存在緩存一致性問題,也就是說,在多核CPU中,每個核的自己的緩存中,關于同一個數據的緩存內容可能不一致。

【2】處理器優化和指令重排

上面提到在在CPU和主存之間增加緩存,在多線程場景下會存在緩存一致性問題。除了這種情況,還有一種硬件問題也比較重要。那就是為了使處理器內部的運算單元能夠盡量的被充分利用,處理器可能會對輸入代碼進行亂序執行處理。這就是處理器優化。

除了現在很多流行的處理器會對代碼進行優化亂序處理,很多編程語言的編譯器也會有類似的優化,比如Java虛擬機的即時編譯器(JIT)也會做指令重排。

可想而知,如果任由處理器優化和編譯器對指令重排的話,就可能導致各種各樣的問題。

解決方法:內存屏障

【3】什么是Java內存模型

內存模型

為了保證共享內存的正確性(可見性、有序性、原子性),內存模型定義了共享內存系統中多線程程序讀寫操作行為的規范。通過這些規則來規范對內存的讀寫操作,從而保證指令執行的正確性。

Java內存模型(Java Memory Model,JMM)是java虛擬機規范定義的,用來屏蔽掉java程序在各種不同的硬件和操作系統對內存的訪問的差異,這樣就可以實現java程序在各種不同的平臺上都能達到內存訪問的一致性。

Java內存模型以及鎖的內存語義

Java內存模型的主要目標是定義程序中變量的訪問規則。即在虛擬機中將變量存儲到主內存或者將變量從主內存取出這樣的底層細節。需要注意的是這里的變量跟我們寫java程序中的變量不是完全等同的。這里的變量是指實例字段,靜態字段,構成數組對象的元素,但是不包括局部變量和方法參數(因為這是線程私有的)。

Java內存模型中涉及到的概念有:

主內存:java虛擬機規定所有的變量(不是程序中的變量)都必須在主內存中產生。可以與前面說的物理機的主內存相比,只不過物理機的主內存是整個機器的內存,而虛擬機的主內存是虛擬機內存中的一部分。

工作內存:java虛擬機中每個線程都有自己的工作內存,該內存是線程私有的。可以與前面說的高速緩存相比。線程的工作內存保存了線程需要的變量在主內存中的副本。虛擬機規定,線程對主內存變量的修改必須在線程的工作內存中進行,不能直接讀寫主內存中的變量。不同的線程之間也不能相互訪問對方的工作內存。如果線程之間需要傳遞變量的值,必須通過主內存來作為中介進行傳遞。

工作內存和主內存的劃分和 Java 堆,棧,方法區的劃分不同,兩者基本沒有關系,如果勉強對應,則主內存可理 解為堆中實例數據部分,工作內存則對應棧中部分區域

【4】volatile的內存語義

volatile寫的內存語義:

當寫一個變量的時候,JMM會把該線程的私有內存中的共享變量值更新到主內存中,并將其他線程中的值置為無效的;

volatile讀的內存語義:

當讀一個變量的時候,JMM會先判斷是否私有空間內的值是否失效,若失效,線程接下來會從主存中讀取變量。

【5】鎖的內存語義

當線程釋放鎖時,JMM會把該線程對應的本地內存中的共享變量刷新到主內存中。

當線程獲取鎖時,JMM會把該線程對應的本地內存置為無效。從而使得被監視器保護的臨界區代碼必須要從主內存中去讀取共享變量。

到此,關于“Java內存模型以及鎖的內存語義”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

曲阜市| 黄骅市| 蒲江县| 兴隆县| 宿松县| 伊宁县| 松潘县| 梁平县| 佳木斯市| 隆子县| 远安县| 克拉玛依市| 马龙县| 肇州县| 富宁县| 贡山| 资兴市| 永胜县| 那曲县| 涿州市| 大连市| 瑞安市| 海阳市| 广昌县| 桐庐县| 临漳县| 哈巴河县| 临夏县| 德昌县| 佛冈县| 大城县| 华宁县| 青田县| 个旧市| 大丰市| 荣昌县| 沙湾县| 南康市| 临高县| 安国市| 溧水县|