日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java并發編程volatile關鍵字的作用

瀏覽:97日期:2022-08-29 15:06:42

日常編程中出現 volatile 關鍵字的頻率并不高,大家可能對 volatile 關鍵字比較陌生,再深入一點也許是聽聞 volatile 只能保證可見性而不能保證原子性,無法有效保證線程安全,于是更加避免使用 volatile ,簡簡單單加上synchronize關鍵字就完事了。本文稍微深入探討 volatile 關鍵字,分析其作用及對應的使用場景。

并發編程的幾個概念簡述

首先簡單介紹幾個與并發編程相關的概念:

可見性

可見性是指變量在線程之間是否可見,JVM 中默認情況下線程之間不具備可見性。

原子性

對于 a = 0 操作是屬于原子操作,但 a = a + 1 則不是原子操作,因為這里涉及到要先讀取原來 a 的值,然后再為 a 加 1 ,當涉及多線程同時執行該語句時,會出現值不穩定的情況,所以非原子操作在并發場景下是不安全的。

有序性

java 內存模型中允許編譯器和處理器進行指令重排優化,重排過程中不會影響單個線程的指令執行順序,但會影響多線程環境中的運行正確性

指令重排

在多核 CPU 的情況下,為了充分利用時間片,提高指令執行效率,處理器會根據一定規則對指令進行重排序,由于規則的限定,指令重排后理論上最終運行結果不變。

volatile 的主要作用

volatile 的主要作用是實現可見性 和禁止指令重排

實現可見性

在 JVM 內存模型中內存分為主內存和工作內存,各線程有獨自的工作內存,對于要操作的數據會從主內存拷貝一份到工作內存中,默認情況下工作內存是相互獨立的,也就是線程之間不可見,而 volatile 最重要的作用之一就是使變量實現可見性。

禁止指令重排

雖然指令重排理論上不會影響執行結果的正確性,但指令重排只能保證底層的機器語言重排序后結果正確,而對于Java高級語言,所以在沒有干預的情況下并不能確保每條語句在編譯對應的指令重排后與期望的執行效果一致。

對于以下示例,由于 ready 沒有指定 volatile ,當變量 ready 線程間不可見時,可能導致線程中讀不到 ready 的新值,無法停止循環;如果指令重排序,可能在線程執行前變量 ready 已賦值為 true ,導致線程內容不打印。

public class NoVisibility { private static boolean ready; private static int number; private static class ReaderThread extends Thread { @Override public void run() { while(!ready) { Thread.yield(); } System.out.println('1'); } } public static void main(String[] args) { new ReaderThread().start(); ready = true; }}

為什么volatile不能保證線程安全?

想要線程安全必須保證原子性,可見性,有序性,而 volatile 只能保證可見性和有序性。

volatile 字段主要是讓線程從主內存中獲取值從而保證可見性,但是CPU中還有一層高速緩存——寄存器,對于非原子性操作,在底層指令運算中還是會出現數據緩存導致運算結果不正確的情況,從而無法保證線程安全。簡單來說,volatile 在多 cpu 環境下不能保證其它 cpu 的緩存同步刷新,因此無法保證原子性。

為什么不直接用synchronized

synchronized 可保證原子性、可見性、有序性,能有效保證線程安全,但是有個缺點是性能開銷較大,而 volatile 是輕量級的線程安全實現方案,在某些特定場合下也能保證線程安全。由于 synchronized 的便捷性,也容易導致 synchronized 的濫用。

雙重檢查鎖

因為 volatile 不能簡易的實現線程安全,需要有較深入的了解才能正確使用,所以 volatile也顯得更為復雜,使用頻率也較低,而 volatile 的一個典型使用例子是雙重檢查鎖模式。

雙重檢查鎖通常用于單例模式或延遲賦值的場景,其代碼通常如下

public class Singleton { private volatile static Singleton uniqueSingleton; // 1. 為變量添加volatile修飾符 private Singleton() { } public Singleton getInstance() { if (null == uniqueSingleton) { //2. 第一重檢查 synchronized (Singleton.class) { // 3. synchronized加鎖 if (null == uniqueSingleton) { // 4. 第二重檢查 uniqueSingleton = new Singleton(); } } } return uniqueSingleton; }}

以下是對這段代碼的一些疑問及解答:

Q: 為什么不在 getInstance 方法直接加 synchronized ?

A: 只有在第一次初始化時才需要加鎖,如果在getInstance方法上加鎖則每次獲取實例時都會對整段代碼塊加鎖,影響性能

Q: 為什么需要雙重檢查?

A: 如果多線程同時通過了第一次檢查,其中一個線程需要通過了第二次檢查才進行實例化對象,其余線程在后續等待獲取到鎖后則判斷到變量非空,跳過賦值操作。

Q: 為什么 uniqueSingleton 需要添加volatile關鍵字?

A: 對于 uniqueSingleton = new Singleton();語句,實際上可以分解成以下三個步驟:

分配內存空間 初始化對象 將對象指向剛分配的內存空間

但是有些編譯器為了性能的原因,可能會將第二步和第三步進行重排序,順序就成了:

分配內存空間 將對象指向剛分配的內存空間 初始化對象

現在考慮重排序后,兩個線程發生了以下調用:

Time Thread A Thread B T1 檢查到uniqueSingleton為空 T2 獲取鎖 T3 再次檢查到uniqueSingleton為空 T4 為uniqueSingleton分配內存空間 T5 將uniqueSingleton指向內存空間 T6 檢查到uniqueSingleton不為空 T7 訪問uniqueSingleton(此時對象還未完成初始化) T8 初始化uniqueSingleton

在這里添加volatile關鍵字主要是避免在對象未完整完成對象創建就已經被其他線程讀取,造成空指針異常。

總結

volatile 的主要作用是實現可見性和禁止指令重排。 線程安全需要滿足可見性、有序性、原子性。 volatile 可以保證可見性和有序性,但是無法保證原子性,所以是線程不安全的。(非原子操作可能會導致數據緩存在CPU的cache中,產生數據不一致) synchronized 關鍵字雖然可以保證可見性、有序性、原子性,而且用法簡單,但是性能開銷大。 雙重檢查鎖模式是 volatile 的典型使用場景,雙重檢查鎖通常用于實現單例模式或延遲賦值。

以上就是Java并發編程volatile關鍵字的作用的詳細內容,更多關于Java volatile關鍵字的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久99免费视频| 欧美日一区二区在线观看| 麻豆久久久久久久| 麻豆精品久久| 国内自拍视频一区二区三区| 九九99久久精品在免费线bt| 日韩精品第一| 国产亚洲欧美日韩在线观看一区二区 | 国产精品伦理久久久久久| 久久精品一本| 青草国产精品| 都市激情国产精品| 亚洲免费精品| 日韩精品免费视频人成| 日韩中文一区二区| 欧美日韩18| 精品国产乱码久久久| 国产主播一区| 精品一区91| 日韩美女精品| 每日更新成人在线视频| 久久男女视频| 日韩欧美三区| 精品久久国产一区| 成人看片网站| 99国产精品视频免费观看一公开| 91久久中文| 日本高清久久| 国际精品欧美精品| 精品久久精品| 久久精品123| 伊人久久大香伊蕉在人线观看热v| 日韩av一区二区在线影视| 欧美国产极品| 国产精品99一区二区| 亚洲三级国产| 丰满少妇一区| 亚洲一区二区三区在线免费| 国产精品v一区二区三区| 欧美精品资源| 国产精品99免费看| 免费日韩视频| 91精品视频一区二区| 免费观看久久av| 久久精品国产大片免费观看| 久久精品72免费观看| 国产一区亚洲| 尤物精品在线| 日韩国产在线观看一区| 色偷偷偷在线视频播放| 久久精品国产精品亚洲毛片| 久久久夜夜夜| 99国产精品久久久久久久成人热| 久久精品国产在热久久| 国产成人精选| 久久久夜精品| 欧美一级专区| 久久精品99国产国产精| 欧美精品成人| 麻豆精品一区二区综合av| a国产在线视频| 91精品一区二区三区综合| 欧美va亚洲va日韩∨a综合色| 91久久黄色| 国产日产精品_国产精品毛片| 久久99免费视频| 美女久久久久| 青青青国产精品| 日本激情一区| 亚洲精品第一| 久久人人97超碰国产公开结果| 不卡一二三区| 精品在线91| 欧美国产亚洲精品| 国产精品99久久免费观看| 欧美天堂一区| 在线精品视频一区| 午夜在线精品偷拍| 亚洲免费网址| 日韩va欧美va亚洲va久久| 亚洲精品乱码| 久久亚洲黄色| 少妇精品久久久一区二区三区| 伊人精品视频| 国产精品日韩欧美一区| 久久精品三级| 久久九九精品| 亚洲精品少妇| 福利片在线一区二区| 香蕉精品久久| 日韩精品一二三四| 美女视频网站久久| 午夜欧美在线| 国产一区二区亚洲| 欧美一级专区| 日韩不卡在线| 麻豆国产精品| 国产精品试看| 国际精品欧美精品| 日本aⅴ亚洲精品中文乱码| 欧美日韩亚洲三区| 国内亚洲精品| 激情欧美国产欧美| 日韩精品亚洲aⅴ在线影院| 国产精品一区二区精品| 国产免费av一区二区三区| 红杏一区二区三区| 在线精品一区二区| 91精品99| 日韩一区二区中文| 欧美xxxx性| 亚洲精品电影| 成人在线视频区| 国产精品日本一区二区不卡视频| 日本成人精品| 成人一区不卡| 香蕉视频亚洲一级| 婷婷综合电影| 欧美另类中文字幕| 97成人在线| 国产一区二区三区久久| 日韩1区2区3区| 久久av综合| 日韩高清中文字幕一区二区| 视频一区在线播放| 亚洲手机在线| 国产一区二区三区探花| 日韩av午夜在线观看| 国产亚洲综合精品| 欧美日韩国产探花| 欧美另类综合| 制服诱惑一区二区| 美女日韩在线中文字幕| 91精品91| 免费成人在线影院| 97人人精品| 日本高清不卡一区二区三区视频| yellow在线观看网址| 国产精品99一区二区三区| 精品一区视频| 天堂√中文最新版在线| av一区在线| 久久亚洲国产精品一区二区| 亚洲中字黄色| 国产伦精品一区二区三区视频| 国产日韩欧美一区| 日本黄色精品| 精品91久久久久| 亚洲免费黄色| 国产欧美日韩综合一区在线播放| 日本v片在线高清不卡在线观看| 国产精品视频一区二区三区| 中文字幕在线视频久| 午夜精品一区二区三区国产| 视频一区中文字幕| 欧美精品97| 亚洲精品一区二区妖精| 日韩国产一二三区| 电影天堂国产精品| 日韩国产欧美三级| 国产伦久视频在线观看| 美国欧美日韩国产在线播放| 国产精品羞羞答答在线观看| 一区二区三区四区在线看| 日韩一区二区三区精品视频第3页| 欧美一区自拍| 美女尤物久久精品| 国产不卡人人| 欧美日韩精品一区二区三区视频| av中文资源在线资源免费观看| 日韩精品成人| 青青在线精品| 久久香蕉网站| 91欧美极品| 男女精品网站| 国产真实久久| 欧美男人天堂| 国产精品黄色| 亚洲深夜福利在线观看| 日韩专区精品| 欧美另类中文字幕| 视频一区免费在线观看| 青青久久av| 色在线视频观看| 九九九精品视频| 久久av中文| 久久精品毛片| 麻豆高清免费国产一区| 欧美另类中文字幕| 亚洲三级网站| 日本不卡视频在线| 免费成人在线视频观看| 99国产精品私拍| 国产视频一区欧美| 欧美日韩国产传媒| www.51av欧美视频| 福利一区和二区| 福利一区二区三区视频在线观看| 国产精品免费99久久久| 欧美激情福利|