一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java并發內存模型詳情

Java并發內存模型詳情

2022-02-24 13:43onlythinking Java教程

這篇文章主要介紹了Java并發內存模型,Java是一門支持多線程執行的語言,要編寫正確的并發程序,了解Java內存模型是重要前提。而了解硬件內存模型有助于理解程序的執行,下面文章就來看看詳細內容吧

Java是一門支持多線程執行的語言,要編寫正確的并發程序,了解Java內存模型是重要前提。而了解硬件內存模型有助于理解程序的執行。

本文主要整理以下內容

  • Java內存模型
  • 硬件內存架構
  • 共享對象可見性
  • 競爭條件

 

1、Java內存模型

Java內存模型最新修訂是在Java5JSR-176 羅列了 J2SE5.0 相關發布特性,包含其中的 JSR-133(JavaTM內存模型與線程規范),java虛擬機遵循此規范。延續至今該內存模型在Java8中依然奏效。

JSR 全稱 Java Specification Requests,意為Java標準化技術規范的正式請求。

Java程序運行在虛擬機上(Jvm)。從邏輯角度看,Jvm內存被劃分為線程堆棧和堆。每個線程都擁有自己的堆棧,該線程堆棧存儲的數據不對其它線程可見。堆內存用于存儲共享數據。

Java并發內存模型詳情

線程堆棧存儲方法中所有局部變量,包含原始類型(booleanbyteshortcharintlongfloatdouble)和對象引用。

堆存儲需要共享對象和靜態變量。

注意:對象不一定都會存儲到堆內存。看下面例子,假如果Object對象不需要被其它線程共享,編譯器會執行堆分配轉化為棧分配。

解釋一下,編譯器會根據對象是否逃逸做出優化。優化的其中一項就是堆分配轉化為棧分配,目的在于減輕GC壓力,提升性能。此優化動作由Jvm參數-XX:+DoEscapeAnalysi 進行控制。Java8 默認開啟。

測試:通過開啟或關閉 -XX:+PrintGC -XX:-DoEscapeAnalysis 觀察是否執行GC來判斷對象存儲位置。

public static void main(String[] args){
     for(int i = 0; i < 10000000; i++){
         createObj();
     }
 }
 public static void createObj(){
     new Object();
 }


Java并發內存模型詳情

 

2、硬件內存架構

如下圖,現代計算機通常都裝有2個或者更多的CPUCPU又可以是多核。一個CPU包含一組寄存器,每個CPU具有一個高速緩存,而高速緩存又分為L1,L2,L3,L4 不同層級緩存。

RAM為主存儲也就是我們說的計算機內存,所有CPU都可以讀取主存儲。

CPU讀取主存儲數據時,它會將部分主存儲數據讀入CPU高速緩存中,又將緩存的中一部分讀入寄存器執行,操作結束后,將值從寄存器刷新到高速緩存中,高速緩存在特定的時刻將數據統一刷新到內存中。

Java并發內存模型詳情

 

3、實際執行

事實上,上面闡述的Java堆棧內存模型是為了理解抽象出來的。實際執行就像下圖一樣,線程棧和堆的數據可能分散到硬件不同的存儲區域。數據分散在不同區域會帶來以下兩個主要問題。

Java并發內存模型詳情

 

3.1 共享對象可見性

下面場景兩個線程同時操作對象obj.count,其中一個線程對obj.count進行更新,但是對其它線程不可見。

線程A操作obj時,先從主存里拷貝一個數據副本到CPU高速緩存,又到寄存器,然后修改obj.count=2后刷新到CPU高速緩存,但是數據暫未同步到主存。以此同時線程B也操作obj,拷貝的數據副本仍然為obj.count=1,這會導致程序結果錯誤。

解決此問題,可以使用Java volatile關鍵字。volatile可簡單理解為跳過CPU高速緩存,讓修改結果及時同步到主存,從而保證了其它線程讀到最新值。volatile 后期專門介紹。

Java并發內存模型詳情

 

3.2 競爭條件

另外一種情況假如果多個線程同時更行obj.count,這時會發生競爭條件。

解決方法,使用Java synchronized 保證線程執行順序,另外synchronized包裹中的所有變量都直接從主存讀取(跳過CPU高速緩存),并且當線程退出synchronized后,所有更新的變量將同步到主存。

Java并發內存模型詳情

總結:

本文記錄Java內存模型,其中主要內容來源于 Jakob Jenkov 大神博客。

   http://tutorials.jenkov.com/java-concurrency/java-memory-model.html

到此這篇關于Java并發內存模型詳情的文章就介紹到這了,更多相關Java并發內存模型內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.onlythinking.com/2020/06/08/java%E5%B9%B6%E5%8F%91%E4%B9%8B%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 香蕉久久一区二区不卡无毒影院 | 国产香蕉一区二区精品视频 | 亚洲国产精品久久久久久网站 | miaa076深田咏美在线 | 国产真实乱子伦xxxxchina | 亚洲欧美日韩高清 | 亚洲国产99在线精品一区69堂 | 黑人好大好硬好深好爽想要h | 亚洲精品久久久久福利网站 | 被高跟鞋调教丨vk | 欧美伊香蕉久久综合类网站 | 91短视频版高清在线观看免费 | jizz农村野外jizz农民 | 含羞草传媒一天免费看下 | 色综合天天五月色 | 91四虎国自产在线播放线 | 婷婷色网 | 秋霞在线观看成人高清视频51 | 久久热在线视频精品1 | 精品在线免费播放 | chinese老头和老太交hd | 男女污网站| 91chinese 永久免费| 日本人啪啪 | 青草社区视频 | 久久久无码精品亚洲欧美 | 91制片厂制作传媒破解版免费 | 四虎影音在线 | 九九精品久久 | 亚洲国产欧美目韩成人综合 | 国产精品成 | 91精品国产免费久久 | 高清毛片aaaaaaaaa片 | 久久精品亚洲国产AV涩情 | 美女视频一区二区三区在线 | 免费二级毛片免费完整视频 | 国产 日韩 欧美 综合 | 啾咪成人漫画免费 | 四虎影院在线免费播放 | 日韩国产成人精品视频 | 农村老少伦小说 |