首頁 Java java教程 JAVA虛擬機器(JVM)詳細介紹(八)-高效率並發

JAVA虛擬機器(JVM)詳細介紹(八)-高效率並發

Aug 24, 2019 pm 05:25 PM
jvm

JAVA虛擬機器(JVM)詳細介紹(八)-高效率並發

記憶體模型

#記憶體模型是在特定的操作協議下,對特定的記憶體或高速緩存進行讀寫存取的過程抽象。其主要目標是定義程式中各個變數的存取規則。

#主記憶體與工作記憶體

JAVA虛擬機器(JVM)詳細介紹(八)-高效率並發

所有的變數都儲存在主內存中,每個線程還有自己的工作內存,其工作內存中是被線程使用到的變量的主內存副本拷貝,線程對變量的讀取、賦值等操作都必須在工作記憶體中進行,而不能直接讀取主記憶體中的變數。

記憶體間互動操作

從主記憶體拷貝到工作記憶體:順序地執行read和load操作。
工作記憶體同步到主記憶體:store和write操作。

volatile的特性

Volatile的作用和synchronized相同,但是和synchronized相比,更輕量。其特性主要有以下兩點:

保證此變數對所有執行緒的可見性

啥意思呢?指當一個執行緒修改了這個變數的值,新值對於其他執行緒來說是立即可知的。而普通變數做不到這一點,普通變數的值在線程間傳遞均需要透過主記憶體來完成,例如線程A修改了一個普通變數的值,然後向主記憶體進行回寫,另外一條線程B在線程A回寫完成了之後再從主記憶體進行讀取操作,新變數值才會對線程B可見。

禁止指令重新排序最佳化

因為指令重新排序會幹擾程式的並發執行。

多重執行緒

#為什麼需要多執行緒?

電腦的運算速度與它的儲存和通訊子系統速度的差距太大,大量的時間都花費在磁碟I/O、網路通訊、資料庫存取上了。使用多執行緒能更好地利用cpu。

有哪些並發應用程式場景?

充分利用電腦處理器

一個服務端同時對多個客戶端提供服務

#如何讓處理器內部的運算單元被充分利用?

加入一層高速緩存

#將運算需要使用到的資料複製到快取中,讓運算能快速進行。當運算結束後再從快取同步回記憶體中,這樣處理器就無須等待緩慢的記憶體讀取了。不過這個要考慮一個問題:怎麼保證快取的一致性。

JAVA虛擬機器(JVM)詳細介紹(八)-高效率並發

對輸入程式碼進行亂序執行最佳化

#執行緒的實作方式

#使用核心執行緒實作

核心執行緒就是直接由作業系統核心支援的執行緒。

使用使用者執行緒實作

使用者執行緒的建立、同步、銷毀和調度完全在使用者狀態中完成,不需要核心的幫助,核心也感知不到線程存在的實作。這種實現方式使用較少。

使用使用者執行緒加上輕量級進行混合實作

合併到一起

執行緒調度

#執行緒調度是指系統為執行緒分配處理器使用權的過程。主要分為兩種:協同式和搶佔式。

協同式

執行緒的執行時間由執行緒本身來控制,執行緒把自己的工作執行完了,會主動通知系統切換到另一個執行緒上。
其優點是實作簡單,而且沒有執行緒同步的問題。缺點是如果一個線程編寫有問題,並且一直不告訴系統進行線程切換,那麼程式就會一直阻塞在那裡,容易導致系統崩潰。

搶佔式

執行緒將由系統來指派執行時間,執行緒切換不由本身來決定。 java使用的執行緒調度方式就是這種。

執行緒安全性

當多個執行緒存取一個物件時,如果不考慮這個執行緒在執行階段環境下的調度和交替執行,也不需要進行額外的同步,或者在調用方進行任何其它的協調操作,調用這個對象的行為都可以獲得正確的結果,那麼這個對象就是安全的。

共享資料的分類


######################################## ####不可變的共享數據是用final修飾的數據,其一定是線程安全的。如果共享資料是一個基本類型變量,那麼只要在定義的時候使用final關鍵字即可。 ######如果共享資料是一個對象,那就需要對象的行為不會對其狀態產生影響,並且可以將對像中帶有狀態的變數都宣告為final。例如String類別就是一個不可變類別#########絕對線程安全######

在Java API中標註自己是線程安全的類,大多數都不是絕對的線程安全。例如Vector是一個執行緒安全的集合,它的所有的方法都被修飾成同步,但是在多執行緒的環境中,它依舊不是同步的。

相對執行緒安全性

#相對執行緒安全性就是我們通常意義上所說的執行緒安全,它只能保證對這個物件單獨操作是線程安全的。但是對於一些特定順序的連續調用,就可能需要在調用端使用額外的同步手段來保證調用的正確性。
大部分的線程安全類別都屬於這種類型。

執行緒相容

物件本身不是線性安全的,但可以透過在呼叫端正確地使用同步手段來確保物件在並發環境中可以安全的使用。大部分的不是線程安全的類,都屬於這種類型。

執行緒對立

#無論如何,都不能在多執行緒環境中並發使用,如System.setIn( )、System.SetOut()。一個對輸入進行修改,一個對輸出進行修改,兩者是不能「交替」進行的。

實作方法

#方式一:互斥同步-悲觀並發策略

(1)synchronized

其原理是:這個關鍵字在經過編譯後,會在同步區塊的前後分別形成monitorenter和monitorexit這兩個字節碼指令。當執行monitorenter指令時,程式會嘗試取得物件的鎖,如果能取得到,則把鎖的計數器 1,對應的,在執行monitorexit時,會將鎖定計數器-1。當計數器為0時,鎖就被釋放。

其特點是:對同一條執行緒來說是可重入的;同步區塊在已進入的執行緒執行完之前,會阻塞後面的其他執行緒進入。

其選用場景是:在確實必要的情況下才使用此,因為其是重量級的。

(2)ReentrantLock

此重入鎖定是java.util.concurrent(JUC)套件下的類別。其高階特性有:等待可中斷、可實現公平鎖、鎖可以綁定多個條件。

方式二:非阻塞同步-樂觀並發策略

#先進行操作,如果沒有其它執行緒爭用共享數據,那操作就是成功了;如果共享資料有爭用,產生了衝突,那就再採取其它的補償措施。

方式三:無同步方案

如果一個方法本來就不涉及共享數據,那就沒有必要進行同步措施。例如可重複程式碼和線程本地儲存。

(1)可重入程式碼

如果一個方法,它的回傳結果是可預測的,只要輸入了相同的數據,就都能傳回相同的結果,那它就滿足可重入的要求。

(2)執行緒本地儲存

如果一段程式碼中所需要的資料必須與其它程式碼共享,而且這些共享資料的程式碼在同一個執行緒中執行,如此,我們可以把共享資料的可見範圍限制在一個執行緒中,這樣,就不用同步也能保證執行緒之間不會出現資料爭用問題。

鎖定最佳化

適應性自旋

因為阻塞或喚醒一個JAVA的線程需要作業系統切換CPU狀態來完成,這種狀態的轉換需要耗費處理器時間。如果同步程式碼區塊中的內容過於簡單,很可能導致狀態轉換消耗的時間比使用者程式碼執行的時間還要長。

為了解決這個問題,我們可以讓後面請求鎖的線程“稍等一下”,執行一個忙循環,進行自旋。此時沒有放棄處理器的執行時間。如果自旋超過了限定的次數,仍然沒有成功獲得鎖,那就會使用傳統的方式去掛起線程了。

 那什麼叫做適應性自旋呢?

就是在同一個鎖定物件上,如果自旋等待剛剛成功獲得過鎖,那虛擬機器就會認為這次自旋獲得鎖的機率挺大,就會允許其自旋等待持續相對更長的時間。相反,如果自旋很少成功獲得過鎖,則可能省略掉自旋過程。

鎖定消除

#指虛擬機器即時編譯器在執行時,對一些程式碼上要求同步,但是被偵測到不可能存在共享資料競爭的鎖進行消除。

鎖定粗化

如果一系列的連續操作都對同一個物件反覆加鎖和解鎖,甚至加鎖操作是出現在循環體中的,那即使沒有執行緒競爭,頻繁地進行互斥同步操作也會導致不必要的性能損耗。
如果虛擬機器偵測到一串零碎的操作都對同一個物件加鎖,將會把加鎖同步的範圍粗化到整個操作序列的外部,這樣只需要加鎖一次就夠了。

#輕量級鎖定

#在沒有多執行緒競爭的前提下,減少傳統的重量級鎖使用作業系統互斥所產生的效能損耗。
適用場景:無實際競爭,多個執行緒交替使用鎖定;允許短時間的鎖定競爭。

偏向鎖定

#偏向鎖定用於減少無競爭且只有一個執行緒使用在鎖的情況下,使用輕量級鎖產生的效能消耗。輕量級鎖每次申請、釋放鎖都至少需要一次CAS,但偏向鎖只有初始化時需要一次CAS。
適用場景:無實際競爭,將來只有第一個申請鎖的執行緒會使用鎖定。

以上是關於JAVA虛擬機器中高效並發的詳細介紹,更多相關問題請訪問PHP中文網:JAVA影片教學

以上是JAVA虛擬機器(JVM)詳細介紹(八)-高效率並發的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
JVM記憶體管理要點與注意事項 JVM記憶體管理要點與注意事項 Feb 20, 2024 am 10:26 AM

掌握JVM記憶體使用量的重點與注意事項JVM(JavaVirtualMachine)是Java應用程式運作的環境,其中最為重要的就是JVM的記憶體管理。合理地管理JVM記憶體不僅可以提高應用程式的效能,還可以避免記憶體洩漏和記憶體溢位等問題。本文將介紹JVM記憶體使用的要點和注意事項,並提供一些具體的程式碼範例。 JVM記憶體分區JVM記憶體主要分為以下區域:堆(He

一個分散式 JVM 監控工具,非常實用! 一個分散式 JVM 監控工具,非常實用! Aug 15, 2023 pm 05:15 PM

該專案為了方便開發者更快監控多個遠端主機jvm,如果你的專案是Spring boot那麼很方便集成,jar包引入即可,不是Spring boot也不用氣餒,你可以快速自行初始化一個Spirng boot程式引入jar包即可

JVM命令列參數詳解:掌控JVM運作的秘密武器 JVM命令列參數詳解:掌控JVM運作的秘密武器 May 09, 2024 pm 01:33 PM

透過JVM命令列參數,您可以細微地調整JVM行為。其中通用參數包括:設定Java堆大小(-Xms、-Xmx)設定新生代大小(-Xmn)啟用平行垃圾收集器(-XX:+UseParallelGC)減少Survivor區記憶體佔用(-XX:-ReduceSurvivorSetInMemory)消除冗餘餘垃圾回收(-XX:-EliminateRedundantGCs)列印垃圾回收資訊(-XX:+PrintGC)使用G1垃圾收集器(-XX:-UseG1GC)設定最大垃圾回收暫停時間(-XX:MaxGCPau

Java錯誤:JVM記憶體溢位錯誤,如何處理與避免 Java錯誤:JVM記憶體溢位錯誤,如何處理與避免 Jun 24, 2023 pm 02:19 PM

Java是一種流行的程式語言,在開發Java應用程式的過程中,可能會遇到JVM記憶體溢位錯誤。這種錯誤通常會導致應用程式崩潰,影響用戶體驗。本文將探討JVM記憶體溢位錯誤的原因和如何處理和避免這種錯誤。 JVM記憶體溢位錯誤是什麼? Java虛擬機器(JVM)是​​Java應用程式的運作環境。在JVM中,記憶體被分為多個區域,其中包括堆疊、方法區、堆疊等。堆是用於存儲創建的對象的

JVM虛擬機器的作用及原理解析 JVM虛擬機器的作用及原理解析 Feb 22, 2024 pm 01:54 PM

JVM虛擬機的作用及原理解析簡介:JVM(JavaVirtualMachine)虛擬機是Java程式語言的核心組成部分之一,它是Java的最大賣點之一。 JVM的作用是將Java原始碼編譯成字節碼,並負責執行這些字節碼。本文將介紹JVM的作用及其運作原理,並提供一些程式碼範例以幫助讀者更好地理解。作用:JVM的主要作用是解決了不同平台上Java程式的可移

揭秘JVM工作原理:深入探索Java虛擬機器的原理 揭秘JVM工作原理:深入探索Java虛擬機器的原理 Feb 18, 2024 pm 12:28 PM

JVM原理詳解:深入探究Java虛擬機的工作原理,需要具體程式碼範例一、引言隨著Java程式語言的快速發展和廣泛應用,Java虛擬機(JavaVirtualMachine,簡稱JVM)也成為了軟體開發中不可或缺的一部分。 JVM作為Java程式的運作環境,能夠提供跨平台的特性,使得Java程式能夠在不同的作業系統上運作。在本文中,我們將深入探討JVM的工作原

如何有效調整JVM堆記憶體大小? 如何有效調整JVM堆記憶體大小? Feb 18, 2024 pm 01:39 PM

JVM記憶體參數設定:如何合理調整堆記憶體大小?在Java應用程式中,JVM是負責管理記憶體的關鍵元件。其中,堆記憶體是用來儲存物件實例的地方,堆記憶體的大小設定對應用程式的效能和穩定性有著重要影響。本文將介紹如何合理調整堆記憶體大小的方法,並附帶具體程式碼範例。首先,我們需要了解一些關於JVM記憶體的基礎知識。 JVM的記憶體分成了幾個區域,包括堆疊記憶體、堆疊記憶體、方法區等。其中

Java程式檢查JVM是32位還是64位 Java程式檢查JVM是32位還是64位 Sep 05, 2023 pm 06:37 PM

在寫java程式來檢查JVM是32位元還是64位元之前,我們先討論一下JVM。 JVM是java虛擬機,負責執行字節碼。它是Java執行時間環境(JRE)的一部分。我們都知道java是平台無關的,但是JVM是平台相關的。我們需要為每個作業系統提供單獨的JVM。如果我們有任何java原始碼的字節碼,由於JVM,我們可以輕鬆地在任何平台上運行它。 java檔案執行的整個過程如下-首先,我們保存擴展名為.java的java原始碼,編譯器將其轉換為擴展名為.class的字節碼。這發生在編譯時。現在,在運行時,J

See all articles