国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

可見性

2019-11-08 03:02:06
字體:
來源:轉載
供稿:網友

java內存模型

Java內存模型把Java虛擬機內部劃分為線程棧和堆。每個線程都有自己的線程棧。如下圖。

線程棧(Thread Stack):線程棧中存放了本地變量(線程執行過程中在方法內定義的變量,無論是基本類型還是引用類型)

堆(Heap):堆上則存放Java程序中創建的所有對象,一個對象包含的成員變量跟隨對象一起存放在堆上

這里寫圖片描述

硬件內存架構

在多核CPU中,在同一時刻,可能每個CPU上邊都同時分別跑著一個線程。

CPU緩存

寄存器:每個CPU都包含一系列的寄存器,它們是CPU內內存的基礎(寄存器容量小,但訪問速度遠遠大于內存)。緩存層:每個CPU可能還有一個CPU緩存層。實際上,絕大多數的現代CPU都有一定大小的緩存層。CPU訪問緩存層的速度快于訪問主存的速度,但通常比訪問內部寄存器的速度還要慢一點。一些CPU還有多層緩存。

CPU讀寫與緩存的關系

讀:當一個CPU需要讀取主存時,它會將主存的部分讀到CPU緩存中。它甚至可能將緩存中的部分內容讀到它的內部寄存器中,然后在寄存器中執行操作。寫:當CPU需要將結果寫回到主存中去時,它會將內部寄存器的值刷新到緩存中,然后在某個時間點將值刷新回主存。

對于理解Java內存模型和內存交互原理,只需要知道CPU內部有一個緩存即可。如下圖。

這里寫圖片描述

Java內存模型和硬件內存架構之間的橋接

硬件內存架構沒有區分線程棧和堆。對于硬件,所有的線程棧和堆都分布在主內中。部分線程棧和堆可能有時候會出現在CPU緩存中和CPU內部的寄存器中。如下圖。

這里寫圖片描述

產生問題

當對象和變量被存放在計算機中各種不同的內存區域中時,就可能會出現一些具體的問題。主要包括如下兩個方面:

線程對共享變量修改的可見性當讀,寫和檢查共享變量時出現競爭條件(race conditions)

共享對象可見性

對于共享對象,多個CPU上的線程可以同時將其讀到CPU緩存中,然后修改這個對象。只要CPU緩存沒有被刷新會主存,對象修改后的版本對跑在其它CPU上的線程都是不可見的。這種方式可能導致每個線程擁有這個共享對象的私有拷貝,每個拷貝停留在不同的CPU緩存中。如下圖。 從本質上來講,這是CPU的自身速度優化,使最新的Java對象不能及時地在多個線程相互可見(一個特性的優化往往會對另一個特性造成缺口)

這里寫圖片描述

競爭條件

如果兩個線程同時將整型變量count讀到各自的CPU緩存中,并且同時對其執行+1操作,最后再將count寫會到內存中,最終count的值只會被+1,而不是+2,盡管執行了兩次+1操作。 這里寫圖片描述


原文鏈接


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嘉定区| 沙湾县| 宜良县| 吴川市| 五峰| 汉川市| 乌拉特中旗| 唐河县| 商水县| 开鲁县| 汤阴县| 江油市| 孟津县| 巨野县| 南丹县| 朝阳县| 毕节市| 望江县| 砚山县| 安陆市| 临湘市| 景谷| 柳河县| 湄潭县| 宁强县| 德令哈市| 南投县| 哈密市| 兴仁县| 潜江市| 大安市| 大渡口区| 揭西县| 镇赉县| 卓尼县| 山东省| 南部县| 西乡县| 南丹县| 福安市| 河南省|