国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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/

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 精品国产乱码久久久久久图片 | 成人av电影在线观看 | 亚洲国产精品99久久久久久久久 | 草草精品视频 | 中文字幕乱码视频32 | 久久亚洲一区 | 亚洲二区视频 | 亚洲一区二区三区四区的 | 天天躁人人躁人人躁狂躁 | 国产精品区二区三区日本 | 91精品久久久久久久久久久 | 精品国产91亚洲一区二区三区www | 国产一区日韩欧美 | a久久久 | 国产精品久久久精品 | 伊人久久综合 | 毛片网站免费在线观看 | 久久精品不卡 | 波多野结衣一二三 | 中文字幕第一页在线 | 亚洲清色 | 中文字幕视频在线 | 国产一区二区三区在线视频 | 亚洲高清在线视频 | 老司机午夜免费精品视频 | 日韩高清在线一区二区三区 | 欧美日韩在线观看一区二区 | 日韩中文字幕在线观看 | 黄色影院在线观看 | 精品久久99| 精品久草 | 亚洲精品系列 | 91精品久久久久久久久 | 国产乱码精品一品二品 | 青青草原综合久久大伊人精品 | 亚洲激情网站 | 精品在线看 | 久久老妇 | 91中文字幕| 一本大道av伊人久久综合 | 欧美日韩国产一区二区三区 |