精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

既生Synchronized,何生Volatile?!

開發 開發工具
Java語言為了解決并發編程中存在的原子性、可見性和有序性問題,提供了一系列和并發處理相關的關鍵字,比如synchronized、volatile、final、concurren包等。

 [[274130]]

在我的博客和公眾號中,發表過很多篇關于并發編程的文章,之前的文章中我們介紹過了兩個在Java并發編程中比較重要的兩個關鍵字:synchronized和volatile

我們簡單回顧一下相關內容:

1、Java語言為了解決并發編程中存在的原子性、可見性和有序性問題,提供了一系列和并發處理相關的關鍵字,比如synchronized、volatile、final、concurren包等。

2、synchronized通過加鎖的方式,使得其在需要原子性、可見性和有序性這三種特性的時候都可以作為其中一種解決方案,看起來是“萬能”的。的確,大部分并發控制操作都能使用synchronized來完成。

3、volatile通過在volatile變量的操作前后插入內存屏障的方式,保證了變量在并發場景下的可見性和有序性。

4、volatile關鍵字是無法保證原子性的,而synchronized通過monitorenter和monitorexit兩個指令,可以保證被synchronized修飾的代碼在同一時間只能被一個線程訪問,即可保證不會出現CPU時間片在多個線程間切換,即可保證原子性。

那么,我們知道,synchronized和volatile兩個關鍵字是Java并發編程中經常用到的兩個關鍵字,而且,通過前面的回顧,我們知道synchronized可以保證并發編程中不會出現原子性、可見性和有序性問題,而volatile只能保證可見性和有序性,那么,既生synchronized、何生volatile?

接下來,本文就來論述一下,為什么Java中已經有了synchronized關鍵字,還要提供volatile關鍵字。

1.synchronized的問題

我們都知道synchronized其實是一種加鎖機制,那么既然是鎖,天然就具備以下幾個缺點:

1、有性能損耗

雖然在JDK 1.6中對synchronized做了很多優化,如如適應性自旋、鎖消除、鎖粗化、輕量級鎖和偏向鎖等(深入理解多線程(五)—— Java虛擬機的鎖優化技術),但是他畢竟還是一種鎖。

以上這幾種優化,都是盡量想辦法避免對Monitor(深入理解多線程(四)—— Moniter的實現原理)進行加鎖,但是,并不是所有情況都可以優化的,況且就算是經過優化,優化的過程也是有一定的耗時的。

所以,無論是使用同步方法還是同步代碼塊,在同步操作之前還是要進行加鎖,同步操作之后需要進行解鎖,這個加鎖、解鎖的過程是要有性能損耗的。

關于二者的性能對比,由于虛擬機對鎖實行的許多消除和優化,使得我們很難量化這兩者之間的性能差距,但是我們可以確定的一個基本原則是:volatile變量的讀操作的性能小號普通變量幾乎無差別,但是寫操作由于需要插入內存屏障所以會慢一些,即便如此,volatile在大多數場景下也比鎖的開銷要低。

2、產生阻塞

我們在深入理解多線程(一)——Synchronized的實現原理中介紹過關于synchronize的實現原理,無論是同步方法還是同步代碼塊,無論是ACC_SYNCHRONIZED還是monitorenter、monitorexit都是基于Monitor實現的。

基于Monitor對象,當多個線程同時訪問一段同步代碼時,首先會進入Entry Set,當有一個線程獲取到對象的鎖之后,才能進行The Owner區域,其他線程還會繼續在Entry Set等待。并且當某個線程調用了wait方法后,會釋放鎖并進入Wait Set等待。

所以,synchronize實現的鎖本質上是一種阻塞鎖,也就是說多個線程要排隊訪問同一個共享對象。

而volatile是Java虛擬機提供的一種輕量級同步機制,他是基于內存屏障實現的。說到底,他并不是鎖,所以他不會有synchronized帶來的阻塞和性能損耗的問題。

2.volatile的附加功能

除了前面我們提到的volatile比synchronized性能好以外,volatile其實還有一個很好的附加功能,那就是禁止指令重排。

我們先來舉一個例子,看一下如果只使用synchronized而不使用volatile會發生什么問題,就拿我們比較熟悉的單例模式來看。

我們通過雙重校驗鎖的方式實現一個單例,這里不使用volatile關鍵字:

  1. public class Singleton {   
  2.        private static Singleton singleton;   
  3.         private Singleton (){}   
  4.         public static Singleton getSingleton() {   
  5.         if (singleton == null) {   
  6.             synchronized (Singleton.class) {   
  7.                 if (singleton == null) {   
  8.                     singleton = new Singleton();   
  9.                 }   
  10.             }   
  11.         }   
  12.        return singleton;   
  13.        }   
  14.     }   

以上代碼,我們通過使用synchronized對Singleton.class進行加鎖,可以保證同一時間只有一個線程可以執行到同步代碼塊中的內容,也就是說singleton = new Singleton()這個操作只會執行一次,這就是實現了一個單例。

但是,當我們在代碼中使用上述單例對象的時候有可能發生空指針異常。這是一個比較詭異的情況。

我們假設Thread1 和 Thread2兩個線程同時請求Singleton.getSingleton方法的時候:

  • Step1 ,Thread1執行到第8行,開始進行對象的初始化。
  • Step2 ,Thread2執行到第5行,判斷singleton == null。
  • Step3 ,Thread2經過判斷發現singleton != null,所以執行第12行,返回singleton。
  • Step4 ,Thread2拿到singleton對象之后,開始執行后續的操作,比如調用singleton.call()。

以上過程,看上去并沒有什么問題,但是,其實,在Step4,Thread2在調用singleton.call()的時候,是有可能拋出空指針異常的。

之所有會有NPE拋出,是因為在Step3,Thread2拿到的singleton對象并不是一個完整的對象。

什么叫做不完整對象,這個怎么理解呢?

我們這里來先來看一下,singleton = new Singleton();這行代碼到底做了什么事情,大致過程如下:

1、虛擬機遇到new指令,到常量池定位到這個類的符號引用。

2、檢查符號引用代表的類是否被加載、解析、初始化過。

3、虛擬機為對象分配內存。

4、虛擬機將分配到的內存空間都初始化為零值。

5、虛擬機對對象進行必要的設置。

6、執行方法,成員變量進行初始化。

7、將對象的引用指向這個內存區域。

我們把這個過程簡化一下,簡化成3個步驟:

a、JVM為對象分配一塊內存M

b、在內存M上為對象進行初始化

c、將內存M的地址復制給singleton變量

如下圖:

因為將內存的地址賦值給singleton變量是最后一步,所以Thread1在這一步驟執行之前,Thread2在對singleton==null進行判斷一直都是true的,那么他會一直阻塞,直到Thread1將這一步驟執行完。

但是,問題就出在以上過程并不是一個原子操作,并且編譯器可能會進行重排序,如果以上步驟被重排成:

  • a、JVM為對象分配一塊內存M
  • c、將內存的地址復制給singleton變量
  • b、在內存M上為對象進行初始化

如下圖:

這樣的話,Thread1會先執行內存分配,在執行變量賦值,最后執行對象的初始化,那么,也就是說,在Thread1還沒有為對象進行初始化的時候,Thread2進來判斷singleton==null就可能提前得到一個false,則會返回一個不完整的sigleton對象,因為他還未完成初始化操作。

這種情況一旦發生,我們拿到了一個不完整的singleton對象,當嘗試使用這個對象的時候就極有可能發生NPE異常。

那么,怎么解決這個問題呢?因為指令重排導致了這個問題,那就避免指令重排就行了。

所以,volatile就派上用場了,因為volatile可以避免指令重排。只要將代碼改成以下代碼,就可以解決這個問題:

  1. public class Singleton {   
  2.      private volatile static Singleton singleton;   
  3.       private Singleton (){}   
  4.       public static Singleton getSingleton() {   
  5.       if (singleton == null) {   
  6.           synchronized (Singleton.class) {   
  7.               if (singleton == null) {   
  8.                   singleton = new Singleton();   
  9.               }   
  10.            }   
  11.        }   
  12.        return singleton;   
  13.        }   
  14.    }   

對singleton使用volatile約束,保證他的初始化過程不會被指令重排。這樣就可以保Thread2 要不然就是拿不到對象,要不然就是拿到一個完整的對象。

3.synchronized的有序性保證呢?

看到這里可能有朋友會問了,說到底上面問題是發生了指令重排,其實還是個有序性的問題,不是說synchronized是可以保證有序性的么,這里為什么就不行了呢?

首先,可以明確的一點是:synchronized是無法禁止指令重排和處理器優化的。那么他是如何保證的有序性呢?

這就要再把有序性的概念擴展一下了。Java程序中天然的有序性可以總結為一句話:如果在本線程內觀察,所有操作都是天然有序的。如果在一個線程中觀察另一個線程,所有操作都是無序的。

以上這句話也是《深入理解Java虛擬機》中的原句,但是怎么理解呢?周志明并沒有詳細的解釋。這里我簡單擴展一下,這其實和as-if-serial語義有關。

as-if-serial語義的意思指:不管怎么重排序,單線程程序的執行結果都不能被改變。編譯器和處理器無論如何優化,都必須遵守as-if-serial語義。

這里不對as-if-serial語義詳細展開了,簡單說就是,as-if-serial語義保證了單線程中,不管指令怎么重排,最終的執行結果是不能被改變的。

那么,我們回到剛剛那個雙重校驗鎖的例子,站在單線程的角度,也就是只看Thread1的話,因為編譯器會遵守as-if-serial語義,所以這種優化不會有任何問題,對于這個線程的執行結果也不會有任何影響。

但是,Thread1內部的指令重排卻對Thread2產生了影響。

那么,我們可以說,synchronized保證的有序性是多個線程之間的有序性,即被加鎖的內容要按照順序被多個線程執行。但是其內部的同步代碼還是會發生重排序,只不過由于編譯器和處理器都遵循as-if-serial語義,所以我們可以認為這些重排序在單線程內部可忽略。

4.總結

本文從兩方面論述了volatile的重要性以及不可替代性:

一方面是因為synchronized是一種鎖機制,存在阻塞問題和性能問題,而volatile并不是鎖,所以不存在阻塞和性能問題。

另外一方面,因為volatile借助了內存屏障來幫助其解決可見性和有序性問題,而內存屏障的使用還為其帶來了一個禁止指令重排的附件功能,所以在有些場景中是可以避免發生指令重排的問題的。

所以,在日后需要做并發控制的時候,如果不涉及到原子性的問題,可以優先考慮使用volatile關鍵字。

【本文是51CTO專欄作者Hollis的原創文章,作者微信公眾號Hollis(ID:hollischuang)】

 

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2012-08-21 15:52:48

2018-06-14 10:56:52

電視顯示器數碼

2024-08-28 11:34:37

2013-08-20 09:25:05

微信易信微信故障

2019-01-03 12:46:19

多云云存儲風險

2010-11-15 10:46:57

簡歷

2015-10-28 14:32:27

大數據幸福

2011-06-30 17:21:56

2023-08-10 17:33:06

元宇宙人工智能

2020-11-02 08:54:29

JMMVolatileSynchronize

2017-01-03 15:08:31

自適應安全應用安全RASP

2015-04-23 08:51:53

2020-01-10 17:21:09

應屆生月薪薪資

2016-08-24 11:13:30

2016-04-13 14:29:42

云計算

2017-03-27 16:44:07

戴爾服務器

2016-11-15 14:31:31

大數據航運大數據

2020-03-10 10:25:38

volatileJava編程語言
點贊
收藏

51CTO技術棧公眾號

美女网站色91| 精品国产一区二区三区噜噜噜 | 亚洲在线视频一区二区| 国产精品无码在线播放| 亚洲精品1234| 日日噜噜噜夜夜爽亚洲精品| 久久久久国产免费| 制服丝袜在线一区| 欧美一区二区三区久久精品| 亚洲欧美日韩国产中文| 三级av免费看| 日韩一区二区三区在线免费观看| 一区二区激情视频| 亚洲国产精品123| 欧美h在线观看| 99热国内精品| 国产一区二区三区三区在线观看| 免费黄色av网址| 精品久久99| 中国色在线观看另类| 国产精品区一区| 国产理论视频在线观看| 久久午夜精品| 91tv亚洲精品香蕉国产一区7ujn| 欧美国产精品一二三| 日本欧美肥老太交大片| 日韩成人久久久| 熟妇无码乱子成人精品| 亚洲精品555| 疯狂欧美牲乱大交777| 欧美做暖暖视频| 一广人看www在线观看免费视频| 91丨porny丨在线| 国产99午夜精品一区二区三区| 一区二区三区午夜| 免费成人美女在线观看| 国产精品video| 成人在线免费看视频| 最新亚洲一区| 欧美激情一级精品国产| 加勒比精品视频| 中文无码日韩欧| 日韩一区二区精品葵司在线| 日韩欧美亚洲另类| 国产天堂在线播放视频| 亚洲视频在线一区| 中文字幕在线乱| 麻豆网站视频在线观看| 中文字幕在线播放不卡一区| 欧美最大成人综合网| 欧洲伦理片一区 二区 三区| 97久久精品人人做人人爽50路| 国产精品美女诱惑| 手机av在线免费观看| 不卡av在线网| 国产精品高清免费在线观看| 无码人妻丰满熟妇精品区| 久久理论电影| 日韩在线www| 亚洲女人久久久| 99久久.com| 欧美成人免费在线观看| 国产污片在线观看| 国产日韩欧美高清免费| 日韩av电影手机在线| 无码人妻一区二区三区线| 青娱乐精品视频| 欧美精品久久久久久久| 精品无码免费视频| 国产精品资源| 国产精品久久久久久久久男 | 九一九一国产精品| 亚洲综合色av| 日本精品一二区| 久久精品亚洲麻豆av一区二区 | 欧美美女一区二区| 91丝袜超薄交口足| 狼人天天伊人久久| 国产一区av在线| 卡通动漫亚洲综合| 国产精品毛片| 国产主播精品在线| 日韩在线观看视频网站| 久久久久久久久久久久久久久99| 亚洲激情一区二区三区| 羞羞视频在线观看不卡| 精品美女永久免费视频| 国产一区亚洲二区三区| 午夜小视频在线观看| 亚洲福利视频一区二区| 亚洲免费av一区二区三区| 久久国际精品| 亚洲欧美日韩一区二区三区在线| 亚洲天堂网av在线| 国产模特精品视频久久久久| 成人在线视频网| 在线视频精品免费| 国产福利一区二区三区视频| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 精品国产亚洲日本| 亚洲美女自拍视频| 免费人成年激情视频在线观看| 噜噜噜91成人网| av资源站久久亚洲| 在线免费观看黄色网址| 精品久久久久久亚洲精品| 国产欧美一区二| 亚洲免费福利一区| 欧美大片在线免费观看| 一级黄色短视频| 91蝌蚪porny九色| 精品国产一区二区三区无码| 偷拍自拍亚洲| 亚洲人成啪啪网站| 日韩av一区二区在线播放| 久久av中文字幕片| 日韩欧美视频第二区| 欧美男人天堂| 亚洲精品一区在线观看| 杨钰莹一级淫片aaaaaa播放| 日韩黄色片在线观看| 国产在线精品一区二区三区| 日韩三级免费| 欧美一区二区私人影院日本| 在线观看日本黄色| 日产国产欧美视频一区精品| 久中文字幕一区| 免费在线中文字幕| 日韩精品最新网址| 午夜精品久久久久99蜜桃最新版 | 91精品1区| 久久精品亚洲94久久精品| 欧美精品一二三四区| 成人国产电影网| 久无码久无码av无码| 亚洲午夜免费| 萌白酱国产一区二区| 一区二区三区午夜| 成人免费在线观看入口| 黄色永久免费网站| 日韩一区三区| 国产日韩欧美在线观看| 日本福利在线| 欧美婷婷六月丁香综合色| x88av在线| 免费av网站大全久久| 亚洲va久久久噜噜噜久久狠狠| 日本一区免费网站| 日韩在线免费观看视频| 国产一级在线播放| 粉嫩一区二区三区性色av| 高清无码视频直接看| 亚洲一区电影| 国内免费精品永久在线视频| 亚洲av激情无码专区在线播放| 午夜久久久影院| 强伦人妻一区二区三区| 久久福利精品| 性高潮久久久久久久久| 在线高清欧美| 欧美多人乱p欧美4p久久| 亚洲精品中文字幕成人片| 亚洲高清免费视频| 五月婷婷综合在线观看| 日日夜夜精品免费视频| 一区二区三区视频在线播放| 另类视频一区二区三区| 久久久在线观看| 欧美色图另类| 欧美日韩高清一区| 麻豆疯狂做受xxxx高潮视频| 91在线码无精品| 色多多视频在线播放| 亚洲国产一区二区三区在线播放| 国产精品久久久久久久久久直播| 亚洲最新无码中文字幕久久| 精品日韩一区二区三区免费视频| 国产一卡二卡在线播放| 久久久久久久av麻豆果冻| 国产又大又黄又粗又爽| 欧美fxxxxxx另类| 精品无人区一区二区三区竹菊| 欧美va在线观看| 欧美精品制服第一页| 欧美色视频免费| 欧美一级在线视频| 天天爽夜夜爽人人爽| 亚洲欧美电影一区二区| 免费中文字幕av| 久久69国产一区二区蜜臀| 日本福利视频一区| 日韩av有码| 精品国产一区二区三区四区精华| 国产成+人+综合+亚洲欧美| 欧美人与性动交| 国产在线高清| 精品999在线播放| 中文字幕视频免费观看| 偷拍一区二区三区| 97成人资源站| 欧美激情一区二区三区蜜桃视频| 88av在线播放| 国内一区二区在线| 久久精品视频91| 亚洲国产一区二区三区高清| 99热都是精品| 日韩精品dvd| 欧美日本韩国国产| 国产福利资源一区| 国精产品一区一区三区有限在线| 69视频在线观看| 亚洲男人天堂古典| 三级网站在线看| 日韩一区二区三| 91国在线视频| 欧美视频一区二区| av大片免费观看| 亚洲一区二区三区自拍| 亚洲色偷偷综合亚洲av伊人| 国产精品视频你懂的| 中文字幕人妻一区二区| 99精品在线观看视频| 波多野结衣三级视频| 韩国欧美国产1区| 性生交免费视频| 久久都是精品| 日本精品www| 久久福利毛片| 激情综合网婷婷| 亚洲制服av| 又粗又黑又大的吊av| 国内精品久久久久久久97牛牛 | 国产精品九九九九| 欧美日韩午夜影院| 日韩欧美一级大片| 日韩欧美高清视频| 国产传媒视频在线| 国产精品色噜噜| 精品人体无码一区二区三区| 日本一区二区三区四区在线视频 | 天天爽夜夜爽夜夜爽| 精品91自产拍在线观看一区| 亚洲成人777777| 精品久久久久久久久久久久包黑料| 99久久国产热无码精品免费| 日韩免费观看高清完整版在线观看| 99精品免费观看| 日韩视频免费直播| 人人妻人人澡人人爽精品日本| 亚洲国产精品久久久久秋霞不卡| www.国产毛片| 91福利小视频| 精品视频在线观看免费| 亚洲国产三级在线| 国产精品视频久久久久久久| 欧美性猛交xxxx免费看漫画| 国产一级片免费在线观看| 在线观看日韩国产| 国产又粗又猛又爽又黄的| 日韩亚洲欧美成人一区| 日本人妻熟妇久久久久久 | 素人fc2av清纯18岁| 国产亚洲午夜高清国产拍精品| 精品丰满少妇一区二区三区| 亚洲天堂久久久久久久| 久久久久亚洲av无码专区体验| 亚洲在线视频一区| 国产精品国产三级国产专区52| 欧洲亚洲精品在线| 国产精品无码免费播放| 亚洲福利小视频| 国产在线超碰| 欧美理论片在线观看| 2021中文字幕在线| 国产精品999999| 国产色99精品9i| 精品久久久久久中文字幕动漫| 精品大片一区二区| 亚洲色婷婷久久精品av蜜桃| 国产欧美精品久久| 午夜免费福利视频在线观看| 成人不卡免费av| 日韩视频在线观看免费视频| 亚洲综合一区二区三区| 成人a v视频| 日韩欧美综合在线| 精品一二三区视频| 欧美疯狂做受xxxx高潮| 久久久一本精品| 岛国一区二区三区高清视频| 精品视频97| 久久精品国产sm调教网站演员| 美腿丝袜在线亚洲一区| 国产一级伦理片| 136国产福利精品导航| 国产精品男女视频| 日韩一本二本av| 国产美女视频一区二区三区| 久操成人在线视频| 黄色精品视频| 精品日本一区二区三区在线观看| 国产精品久久久久久| 免费激情视频在线观看| 成人午夜电影网站| 久久精品aⅴ无码中文字字幕重口| 国产视频一区在线观看| 日韩精品视频播放| 5566中文字幕一区二区电影| 成人在线观看免费| 欧美在线观看日本一区| 99re8这里有精品热视频8在线 | 国产精品一区二区三区视频网站| 欧美壮男野外gaytube| 中文字幕久久精品一区二区| 亚洲欧美日韩精品在线| 久久人人超碰| 黄色国产在线观看| 亚洲高清免费视频| 性一交一乱一色一视频麻豆| 日韩中文av在线| 欧美色片在线观看| 欧洲在线视频一区| 免费在线成人| 国产又粗又猛又色| 亚洲五码中文字幕| 亚洲国产精品无码久久| 久久在精品线影院精品国产| 祥仔av免费一区二区三区四区| 日韩一区国产在线观看| 日韩av一级电影| 西西444www无码大胆| 色偷偷久久人人79超碰人人澡| 亚洲日本中文字幕在线| 91精品国产91久久久久久| 精品久久ai| 欧美精品一区二区三区三州| 不卡的电视剧免费网站有什么| 日韩三级视频在线| 黄色一级a毛片| 精品1区2区在线观看| 午夜dj在线观看高清视频完整版| 91精品在线国产| 亚洲五月综合| h无码动漫在线观看| 国产麻豆日韩欧美久久| 欧美成人片在线观看| 日韩欧美一区二区久久婷婷| 国产传媒在线播放| 91精品国自产在线观看| 综合伊思人在钱三区| 亚洲精品无码久久久久久| 91色.com| 国产女优在线播放| 中文字幕久久久| 亚洲爱爱视频| gogogo免费高清日本写真| 国产综合色产在线精品| a级片在线观看免费| 精品国产乱码久久| 三妻四妾完整版在线观看电视剧 | 欧美视频日韩视频| 日本在线观看视频| 5566av亚洲| 在线亚洲观看| 中文字幕人妻一区二区三区在线视频| 在线欧美小视频| yellow91字幕网在线| 国产伦精品一区二区三区四区免费| 久久xxxx| 亚洲最大的黄色网址| 亚洲国产精品人人爽夜夜爽| 成人av观看| 亚洲最新在线| 成人性生交大片免费看中文网站| 色网站在线播放| 在线看日韩av| 一区二区三区高清在线观看| 国产1区2区在线| 亚洲视频在线一区观看| 天堂中文资源在线| 91精品免费久久久久久久久| 亚洲香蕉网站| 阿v天堂2014| 337p日本欧洲亚洲大胆精品| 久久久成人av毛片免费观看| 九一免费在线观看| 国产亲近乱来精品视频| 亚洲第一视频在线播放| 国产91色在线|免| 欧美视频久久| 99久久99久久精品免费看小说.| 精品蜜桃在线看| 久久99国产精品二区高清软件| 全黄性性激高免费视频| 国产精品成人一区二区三区夜夜夜| 免费观看国产精品| 国产精品中文在线| 先锋影音久久| 久久久久无码精品国产| 日韩在线免费视频观看|