搜尋
首頁Javajava教程Java可見性機制的原理

Java可見性機制的原理

Nov 14, 2016 am 09:26 AM
java

基本概念

1.可見性

當一個執行緒修改了共享變數時,另一個執行緒可以讀取到這個修改後的值。

2.記憶體屏障(Memory Barriers)

處理器的一組指令,用於實現對記憶體操作的順序限制。

3.緩衝行

CPU告訴快取中可以分配的最小儲存單位,處理器填寫快取行時,會載入整個快取行。

4.Lock前綴的指令

Lock前綴的指令在多核心處理器下會發生兩件事:

1)將目前處理器的快取行的資料聯想到系統記憶體。

2)這個寫回記憶體的操作會使其他CPU快取了該記憶體的位址的資料無效。

5.快取一致性協定

在多處理器下,為零保證各個處理器的快取是一致的,每個處理器都會透過嗅探在總線上傳播的資料來檢查自己快取的值是不是過期了。當處理器發現自己快取行對應的位址被修改,就會將目前處理器的快取行設定為無效狀態。當處理器對這個資料進行讀寫的時候,會重新把資料從記憶體讀取到處理器快取中。

6.CAS

CompareAndSwap 比較並交換

CAS操作需要輸入兩個值,一個舊值(執行CAS操作前的值,期望值)和一個新值,只有噹噹前值等於舊值時,才可以將目前值設為新值,否則不設定。這是一個原子操作,由硬體保證。

7.重排序規則

從根本上來所,JMM 對編譯器和處理器的重排序限制只有一條,只要不改變程式執行的結果(指的是單執行緒或正確同步的多執行緒環境下) ,那麼編譯器和處理器怎麼優化都可以。

Volatile

從上面的Lock前綴指令和快取一致性協定可以看出來,這就是volatile的實作原理了。

實際上,valatile變數被寫入時,確實加了一個Lock前綴的指定,以此來達到可見性的目的。

final

Final域只能被顯示地賦值一次,但是這並不代表final域不能被多次初始化。

例如:final int i ;i在建構函式中被賦值之前,就會被初始化為預設的值:0.透過偵錯程式碼可以證明這一點。

為了保證final域的值不會在為初始化的情況下被訪問到,程式設計師只需要保證一點即可:即,在構造函數中,正在被構造的對象(this)沒有“逸出”,那麼不需要任何同步手段,就能確保任意執行緒看到的final域,包括基本型別和參考型,都是已經被正確地透過建構子初始化過了的。

一個會是正在被構造的物件逸出的例子:

public class FinalTest{ 
   final int i; 
   static FinalTest obj; 
 
   public FinalTest(){ 
   i  =1; 
   /** 
   *这里会使正在被构造的对象逸出,如果和上一句做了重排序,那么其他线程就可以通过obj访问到还为被初始化的final域。 
   **/ 
   obj = this;  
  } 
}

Happens-Before規則

happens-before的含義

Happen-Before規則用來描述兩個操作之間的順序關係,這兩個規則關係操作可以再一個執行緒內,也可以不再一個執行緒內。此順序並不嚴格意味著執行時間上的順序,而是至前一個操作的結果要對後一個操作可見。

Happens-Before關係的定義如下:

如果一個happens-before另一個操作,那麼第一個操作的執行結果對第二個操作可見,而且第一個操作的執行順序排在第二個操作之前

兩個操作之間存在happens-before關係,並不表示Java平台的具體實作必須按照happens-before關係指定的順序來執行。如果重排序之後的執行結果,與依照happens-before關係來執行的結果一致,那麼這種重新排序並不非法。

舉例來說,如果在程式執行順序上,A先於B,並且A修改了共享變量,而B正好使用該共享變量,那麼A需要happen-before B,再直白一點,就是A對共享變數的修改,需要在B執行時,對B可見。

happens-before規則

程式順序規則:一個執行緒中的每個操作,happens-before於該執行緒中的任意後續操作。

監視器鎖規則:對一個鎖的解鎖,happens-before於隨後對這個鎖的加鎖。

volatile規則:對一個volatile域的寫,happens-before於任意後續對這個volatile域的讀。

傳遞性:如果Ahappens-before B,並且B happens-before C,那麼A happens-before C。

start()規則:如果執行緒A執行操作ThreadB.start(),那麼A執行緒的ThreadB.start()操作happens-before於執行緒B中的任意操作。

join()規則:如果執行緒A執行操作ThreadB.join()並成功返回,那麼執行緒B的任意操作happens-before於執行緒A從ThreadB.join()操作成功返回。

對所有這些規則的說明:Ahappens-before B並不意味著A一定要先在B之前發生,而是說,如果A已經發生在了B前面,那麼A的操作結果一定要對B可見


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
是否有任何威脅或增強Java平台獨立性的新興技術?是否有任何威脅或增強Java平台獨立性的新興技術?Apr 24, 2025 am 12:11 AM

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

JVM的實現是什麼,它們都提供了相同的平台獨立性?JVM的實現是什麼,它們都提供了相同的平台獨立性?Apr 24, 2025 am 12:10 AM

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性如何降低發展成本和時間?平台獨立性如何降低發展成本和時間?Apr 24, 2025 am 12:08 AM

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。

Java的平台獨立性如何促進代碼重用?Java的平台獨立性如何促進代碼重用?Apr 24, 2025 am 12:05 AM

Java'splatformindependencefacilitatescodereusebyallowingbytecodetorunonanyplatformwithaJVM.1)Developerscanwritecodeonceforconsistentbehavioracrossplatforms.2)Maintenanceisreducedascodedoesn'tneedrewriting.3)Librariesandframeworkscanbesharedacrossproj

您如何在Java應用程序中對平台特定問題進行故障排除?您如何在Java應用程序中對平台特定問題進行故障排除?Apr 24, 2025 am 12:04 AM

要解決Java應用程序中的平台特定問題,可以採取以下步驟:1.使用Java的System類查看系統屬性以了解運行環境。 2.利用File類或java.nio.file包處理文件路徑。 3.根據操作系統條件加載本地庫。 4.使用VisualVM或JProfiler優化跨平台性能。 5.通過Docker容器化確保測試環境與生產環境一致。 6.利用GitHubActions在多個平台上進行自動化測試。這些方法有助於有效地解決Java應用程序中的平台特定問題。

JVM中的類加載程序子系統如何促進平台獨立性?JVM中的類加載程序子系統如何促進平台獨立性?Apr 23, 2025 am 12:14 AM

類加載器通過統一的類文件格式、動態加載、雙親委派模型和平台無關的字節碼,確保Java程序在不同平台上的一致性和兼容性,實現平台獨立性。

Java編譯器會產生特定於平台的代碼嗎?解釋。Java編譯器會產生特定於平台的代碼嗎?解釋。Apr 23, 2025 am 12:09 AM

Java編譯器生成的代碼是平台無關的,但最終執行的代碼是平台特定的。 1.Java源代碼編譯成平台無關的字節碼。 2.JVM將字節碼轉換為特定平台的機器碼,確保跨平台運行但性能可能不同。

JVM如何處理不同操作系統的多線程?JVM如何處理不同操作系統的多線程?Apr 23, 2025 am 12:07 AM

多線程在現代編程中重要,因為它能提高程序的響應性和資源利用率,並處理複雜的並發任務。 JVM通過線程映射、調度機制和同步鎖機制,在不同操作系統上確保多線程的一致性和高效性。

See all articles

熱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

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

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Mac版

SublimeText3 Mac版

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