最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java并發(fā)編程之關(guān)鍵字volatile知識總結(jié)

 更新時間:2021年06月08日 14:31:55   作者:菜鳥日常  
今天帶大家學習java的相關(guān)知識,文章圍繞著Java關(guān)鍵字volatile展開,文中有非常詳細的知識總結(jié),需要的朋友可以參考下

一、作用

被 volatile 修飾的變量

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

2.禁止指令重排序

二、可見性

在這里插入圖片描述

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

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

三、有序性

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

指令重排序會考慮數(shù)據(jù)之間的依賴性,不會影響單個線程內(nèi)程序的執(zhí)行結(jié)果

c = 2 可能在 a = 1之前執(zhí)行

int a = 1;
int c = 2;

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

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

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

對于 volatile 的有序性應(yīng)用,一般常用 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() 開辟堆內(nèi)存空間

2.初始化 singleton 對象

3.將 singleton 對象指向堆內(nèi)存地址

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

四、happens-before

  • 程序順序規(guī)則: 一個線程中的每個操作,happens-before于該線程中的任意后續(xù)操作
  • 監(jiān)視器鎖規(guī)則:對一個線程的解鎖,happens-before 于隨后對這個線程的加鎖
  • volatile 變量規(guī)則: 對一個 volatile 域的寫,happens-before 于后續(xù)對這個 volatile 域的讀
  • 傳遞性:如果 A happens-before B ,且 B happens-before C, 那么 A happens-before C
  • start()規(guī)則: 如果線程A執(zhí)行操作ThreadB_start()(啟動線程B) , 那么A線程的ThreadB_start()happens-before 于B中的任意操作
  • join()原則: 如果A執(zhí)行ThreadB.join()并且成功返回,那么線程B中的任意操作happens-before于線程A從ThreadB.join()操作成功返回。
  • interrupt()原則: 對線程interrupt()方法的調(diào)用先行發(fā)生于被中斷線程代碼檢測到中斷事件的發(fā)生,可以通過Thread.interrupted()方法檢測是否有中斷發(fā)生
  • finalize()原則:一個對象的初始化完成先行發(fā)生于它的finalize()方法的開始

五、與 Synchronized 對比

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

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

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

到此這篇關(guān)于Java并發(fā)編程之關(guān)鍵字volatile知識總結(jié)的文章就介紹到這了,更多相關(guān)Java關(guān)鍵字volatile內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?MVC異步上傳、跨服務(wù)器上傳和文件下載功能實現(xiàn)

    Spring?MVC異步上傳、跨服務(wù)器上傳和文件下載功能實現(xiàn)

    這篇文章主要介紹了Spring?MVC異步上傳、跨服務(wù)器上傳和文件下載功能實現(xiàn),本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Spring Cloud Config工作原理概述

    Spring Cloud Config工作原理概述

    Spring Cloud Config 是 Spring Cloud 生態(tài)系統(tǒng)的一部分,它提供了一種集中化管理應(yīng)用配置的方法,本文給大家介紹Spring Cloud Config工作原理概述,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • 使用@NonNull注解遇到的小問題及解決

    使用@NonNull注解遇到的小問題及解決

    這篇文章主要介紹了使用@NonNull注解遇到的小問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • springboot?vue接口測試HutoolUtil?TreeUtil處理樹形結(jié)構(gòu)

    springboot?vue接口測試HutoolUtil?TreeUtil處理樹形結(jié)構(gòu)

    這篇文章主要介紹了springboot?vue接口測試HutoolUtil?TreeUtil處理樹形結(jié)構(gòu),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Java常用注解擴展對比舉例詳解

    Java常用注解擴展對比舉例詳解

    這篇文章主要介紹了Java常用注解擴展對比的相關(guān)資料,提供了豐富的代碼示例,并總結(jié)了最佳實踐建議,幫助開發(fā)者更好地理解和應(yīng)用這些注解,需要的朋友可以參考下
    2025-03-03
  • java控制臺輸出百分比進度條示例

    java控制臺輸出百分比進度條示例

    這篇文章主要介紹了java控制臺輸出百分比進度條示例,需要的朋友可以參考下
    2014-04-04
  • 一文詳解Java中的注解(Annotation)

    一文詳解Java中的注解(Annotation)

    在Java中注解(Annotation)引入始于Java5,用來描述Java代碼的元信息,通常情況下注解不會直接影響代碼的執(zhí)行,盡管有些注解可以用來做到影響代碼執(zhí)行,這篇文章主要給大家介紹了關(guān)于Java中注解(Annotation)的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • 利用Maven添加工程版本信息及時間戳

    利用Maven添加工程版本信息及時間戳

    這篇文章主要介紹了利用Maven添加工程版本信息及時間戳方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot 部署到服務(wù)器上的方法

    SpringBoot 部署到服務(wù)器上的方法

    下面小編就為大家分享一篇SpringBoot 部署到服務(wù)器上的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • SpringBoot結(jié)合Mybatis實現(xiàn)創(chuàng)建數(shù)據(jù)庫表的方法

    SpringBoot結(jié)合Mybatis實現(xiàn)創(chuàng)建數(shù)據(jù)庫表的方法

    本文主要介紹了SpringBoot結(jié)合Mybatis實現(xiàn)創(chuàng)建數(shù)據(jù)庫表的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

永宁县| 宾川县| 南陵县| 东源县| 龙游县| 永登县| 抚顺市| 宾川县| 霞浦县| 台南县| 方城县| 长葛市| 盐津县| 林西县| 巩义市| 青铜峡市| 永丰县| 刚察县| 长春市| 鄢陵县| 安丘市| 工布江达县| 长丰县| 滕州市| 林芝县| 大姚县| 新民市| 阿鲁科尔沁旗| 沙洋县| 封开县| 得荣县| 尉氏县| 乌兰浩特市| 金山区| 澎湖县| 汉寿县| 南昌县| 巴彦淖尔市| 丰原市| 漯河市| 疏附县|