中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java并發編程之關鍵字volatile的示例分析

發布時間:2021-06-09 09:53:54 來源:億速云 閱讀:150 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關Java并發編程之關鍵字volatile的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一、作用

被 volatile 修飾的變量

1.保證了不同線程對該變量操作的內存可見性

2.禁止指令重排序

二、可見性

Java并發編程之關鍵字volatile的示例分析

Java 內存模型(Java Memory Model) 是 Java 虛擬機定義的一種規范,即每個線程都有自己的工作空間,線程對變量的操作都在線程的工作內存中完成,再同步到主存中,這樣可能會導致不同的線程對共享變量的操作,在各自線程工作空間內不一樣的問題。

而用 volatile 修飾的變量,線程對該變量的修改,會立刻刷新到主存,其它線程讀取該變量時,會重新去主存讀取新值。

三、有序性

CPU 為了提供程序的運行效率,會對代碼的執行順序進行重排,因此代碼中各個語句的先后執行順序有可能會變化,但是它會保證程序最終執行結果與代碼順序執行結果一致。

指令重排序會考慮數據之間的依賴性,不會影響單個線程內程序的執行結果

c = 2 可能在 a = 1之前執行

int a = 1;
int c = 2;

volatile 修飾的變量具有有序性,即被 volatile 修飾的變量,在其前面的操作與在其后面的操作的執行順序不能打亂。

int a= 1;
volatile b = 2;
int c = 2;

a = 1 一定在 c = 2 前面執行,volatile 的作用好像在兩者之間插入了一個內存屏障

對于 volatile 的有序性應用,一般常用 double-check 的單例模式來說明

public class Singleton {
	private Singleton(){}

	private static volatile Singleton singleton;
	
	public static Singleton getSingleton(){
		if (singleton == null){
			synchronized(Singleton.class){
				if (singleton == null){
					singleton = new Singleton();
				}
			}
		}
		return singleton		
	}
}

singleton = new Singleton(); 分為 3 步

1.new Singleton() 開辟堆內存空間

2.初始化 singleton 對象

3.將 singleton 對象指向堆內存地址

第 3 步可能在第 2 步之前執行,那么其它線程可能得到為初始化完成的 singleton 對象,造成異常。

四、happens-before

  • 程序順序規則: 一個線程中的每個操作,happens-before于該線程中的任意后續操作

  • 監視器鎖規則:對一個線程的解鎖,happens-before 于隨后對這個線程的加鎖

  • volatile 變量規則: 對一個 volatile 域的寫,happens-before 于后續對這個 volatile 域的讀

  • 傳遞性:如果 A happens-before B ,且 B happens-before C, 那么 A happens-before C

  • start()規則: 如果線程A執行操作ThreadB_start()(啟動線程B) , 那么A線程的ThreadB_start()happens-before 于B中的任意操作

  • join()原則: 如果A執行ThreadB.join()并且成功返回,那么線程B中的任意操作happens-before于線程A從ThreadB.join()操作成功返回。

  • interrupt()原則: 對線程interrupt()方法的調用先行發生于被中斷線程代碼檢測到中斷事件的發生,可以通過Thread.interrupted()方法檢測是否有中斷發生

  • finalize()原則:一個對象的初始化完成先行發生于它的finalize()方法的開始

五、與 Synchronized 對比

1.volatile 只能作用于變量,synchronized 可以作用于變量,方法,代碼塊

2.volatile 不保證原子性,synchronized 可以保證

3.訪問 volatile 修飾的變量不會阻塞,synchronized 可能會

感謝各位的閱讀!關于“Java并發編程之關鍵字volatile的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

惠水县| 永登县| 淅川县| 山阳县| 泌阳县| 临颍县| 于都县| 临洮县| 德保县| 平谷区| 克山县| 城口县| 任丘市| 新泰市| 喜德县| 辛集市| 浦江县| 松滋市| 华容县| 兴仁县| 平凉市| 平罗县| 同德县| 江华| 汉阴县| 鄱阳县| 中山市| 炎陵县| 湛江市| 广水市| 高碑店市| 龙山县| 芮城县| 南漳县| 化隆| 太和县| 普洱| 监利县| 酒泉市| 盐城市| 岳阳市|