亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java中鎖的實現和內存語義淺析

2024-07-14 08:42:52
字體:
來源:轉載
供稿:網友

1. 概述

鎖是Java并發編程中最重要的同步機制。鎖除了讓臨界區互斥執行外,還可以讓釋放鎖的線程獲取同一個鎖的線程發送消息。

鎖在實際使用時只是明白鎖限制了并發訪問, 但是鎖是如何實現并發訪問的, 同學們可能不太清楚, 下面這篇文章就來揭開鎖的神秘面紗.

2. 鎖的內存語義

  • 當線程獲取鎖時, JMM會把線程對應的本地內存置為無效. 從而使得被監視器保護的臨界區的變量必須從主內存中讀取.
  • 當線程釋放鎖時, JMM會把該線程對應的本地內存中的共享變量刷新到主內存中(并不是不釋放鎖就不刷新到主內存, 只是釋放鎖時把未刷新到主內存中的數據刷新到主內存).

鎖的內存語義與volatile的內存語義

  • 鎖獲取與volatile讀有相同的內存語義.
  • 鎖釋放與volatile寫有相同的內存語義.

內存語義總結

  • 線程A釋放一個鎖, 實質上是線程A向接下來將要獲取這個鎖的某個線程發出了(線程A對共享變量所做修改的)消息.
  • 線程B獲取一個鎖, 實質上是線程B接收了之前某個線程發出的(在釋放這個鎖之前對共享變量所做修改的)消息.
  • 線程A釋放鎖, 隨后線程B獲取這個鎖, 這個過程實質上是線程A通過主內存向線程B發送消息.

3. 鎖內存語義的實現

下面以ReentrantLock為例, 獲取到鎖就是把state改為1(不考慮重入), 釋放鎖時改為0.

而加鎖的關鍵代碼就是

protected final boolean compareAndSetState(int expect, int update) { return unsafe.compareAndSwapInt(this, stateOffset, expect, update);}

該方法以原子操作的方式更新state變量, 本文把Java的compareAndSet()方法簡稱為CAS. JDK文檔對該方法的說明如下: 如果當前狀態值等于預期值, 則以原子方式將同步狀態設置為給定的更新值. 此操作具有volatile讀和寫的內存語義.

這里我們分別從編譯器和處理器的角度來分析: CAS如何同時具有volatile讀和volatile寫的內存語義.

我們知道, 編譯器不會對volatile讀與volatile讀后面的任意內存操作重排序; 編譯器不會對volatile寫與volatile寫前面的任意內存操作重排序. 組合這兩個條件, 意味著為了同時實現volatile讀和volatile寫的內存語義, 編譯器不能對CAS與CAS前面和后面的任意內存操作重排序.

下面我們來分析在常見的intel X86處理器中, CAS是如何同時具有volatile讀和volatile寫的內存語義的.

下面是sun.misc.Unsafe類的compareAndSwapInt()方法的源代碼.

public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

可以看到, 這是一個本地方法調用. 這個本地方法在openjdk中依次調用的c++代碼為: unsafe.cpp, atomic.cpp 和 atomic_windows_x86.inline.hpp. 這個本地方法的最終實現在openjdk的如下位置: openjdk-7-fcs-src-b147-
27_jun_2011/openjdk/hotspot/src/os_cpu/windows_x86/vm/atomic_windows_x86.inline.hpp(對應于
Windows操作系統, X86處理器). 下面是對應于intel X86處理器的源代碼的片段.

inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) { // alternative for InterlockedCompareExchange int mp = os::is_MP(); __asm {  mov edx, dest  mov ecx, exchange_value  mov eax, compare_value  LOCK_IF_MP(mp)  cmpxchg dword ptr [edx], ecx }}

如上面源代碼所示, 程序會根據當前處理器的類型來決定是否為cmpxchg指令添加lock前綴. 如果程序是在多處理器上運行, 就為cmpxchg指令加上lock前綴(Lock Cmpxchg). 反之, 如果程序是在單處理器上運行, 就省略lock前綴(單處理器自身會維護單處理器內的順序一致性, 不需要lock前綴提供的內存屏障效果).

intel的手冊對lock前綴的說明如下.

  • 確保對內存的讀-改-寫操作原子執行. 在Pentium及Pentium之前的處理器中, 帶有lock前綴的指令在執行期間會鎖住總線, 使得其他處理器暫時無法通過總線訪問內存. 很顯然, 這會帶來昂貴的開銷. 從Pentium 4、Intel Xeon及P6處理器開始, Intel使用緩存鎖定(Cache Locking)
    來保證指令執行的原子性. 緩存鎖定將大大降低lock前綴指令的執行開銷.
  • 禁止該指令, 與之前和之后的讀和寫指令重排序.
  • 把寫緩沖區中的所有數據刷新到內存中.

上面的第2點和第3點所具有的內存屏障效果, 足以同時實現volatile讀和volatile寫的內存語義.

經過上面的分析, 現在我們終于能明白為什么JDK文檔說CAS同時具有volatile讀和volatile寫的內存語義了.

從本文對ReentrantLock的分析可以看出, 鎖釋放-獲取的內存語義的實現至少有下面兩種方式.

  • 利用volatile變量的寫-讀所具有的內存語義.
  • 利用CAS所附帶的volatile讀和volatile寫的內存語義.

4. 總結

對于鎖, 可以這么理解, N個線程去通過CAS去修改一個volatile變量, 但是由于CPU提供的機制, 只能有一個線程修改成功, 修改成功的線程獲得鎖, 其它線程以及后來的線程要么自旋一會兒, 要么直接掛起, 等待獲取鎖的線程釋放鎖時去喚醒. 就是這么個過程.

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久久久久免费| 78色国产精品| www日韩中文字幕在线看| 亚洲精品免费av| 久久香蕉频线观| 高清欧美性猛交xxxx| 欧美日韩一区免费| 久久国产精品99国产精| 在线看国产精品| 精品久久中文字幕久久av| 亚洲精品丝袜日韩| 亚洲第一精品久久忘忧草社区| 992tv在线成人免费观看| 欧美午夜片欧美片在线观看| 久久综合免费视频影院| 国产日产欧美a一级在线| 久久精品国产清自在天天线| 日韩高清欧美高清| 欧美激情亚洲一区| 日韩精品视频三区| 美日韩丰满少妇在线观看| 亚洲精品美女网站| 欧美在线激情视频| 亚洲tv在线观看| 国产日韩精品在线观看| 亚洲电影免费观看高清完整版在线观看| 91沈先生作品| 色婷婷av一区二区三区在线观看| 91在线网站视频| 欧美黑人视频一区| 国产亚洲精品久久久久久| 亚洲精品成人久久| 欧美激情免费在线| 欧美午夜丰满在线18影院| 欧美另类老肥妇| 色与欲影视天天看综合网| 成人免费高清完整版在线观看| 国产成人鲁鲁免费视频a| 亚洲性生活视频| 久久精品国产欧美亚洲人人爽| 狠狠躁夜夜躁久久躁别揉| 97色在线观看| 国产精品99久久久久久人| 日韩欧美a级成人黄色| 中文字幕日韩av电影| 日本久久久久久| 一区二区福利视频| 欧美日韩综合视频网址| 国产一区二区三区直播精品电影| 黑人精品xxx一区| 中文字幕自拍vr一区二区三区| 亚洲精品久久视频| 国产精品一区二区久久久久| 啊v视频在线一区二区三区| 亚洲影视九九影院在线观看| 日韩欧美在线字幕| 欧美日韩一区二区三区| 日韩av黄色在线观看| 国产精品入口日韩视频大尺度| 欧美日韩免费在线观看| 中文字幕日韩电影| 日本亚洲欧洲色| 国产a∨精品一区二区三区不卡| 久久大大胆人体| 夜夜狂射影院欧美极品| 亚洲日本成人网| 成人av番号网| 2019中文字幕免费视频| 欧美精品18videos性欧美| 亚洲网在线观看| 国产v综合v亚洲欧美久久| 久久久噜噜噜久噜久久| 色偷偷偷亚洲综合网另类| 92裸体在线视频网站| 亚洲韩国欧洲国产日产av| 欧美视频在线观看免费| 亚洲一区精品电影| 亚洲人成在线观看网站高清| 亚洲精选在线观看| 午夜精品福利视频| 川上优av一区二区线观看| 亚洲大胆人体视频| 国产精品视频中文字幕91| 日韩中文字幕免费看| 欧美成人在线免费视频| 在线播放日韩专区| www欧美日韩| 高潮白浆女日韩av免费看| 91国内在线视频| 国产成人一区二区在线| 美女撒尿一区二区三区| 欧美日韩亚洲精品内裤| 欧美福利在线观看| 欧美日韩中国免费专区在线看| 成人激情视频在线观看| 亚洲春色另类小说| 成人性生交大片免费观看嘿嘿视频| 欧美香蕉大胸在线视频观看| 成人a在线视频| 亚洲乱码av中文一区二区| 国产精品人成电影在线观看| 欧美日韩在线观看视频| 77777少妇光屁股久久一区| 色偷偷av亚洲男人的天堂| 国产精品欧美一区二区三区奶水| 欧美成人免费在线视频| 九九精品视频在线| 国产精品专区第二| 亚洲欧洲在线免费| 亚洲japanese制服美女| 亚洲国产精品视频在线观看| 精品视频一区在线视频| 亚洲第一精品福利| 日韩精品在线免费观看视频| 日韩va亚洲va欧洲va国产| 福利视频一区二区| 国产一区二区三区在线观看网站| 欧美一区三区三区高中清蜜桃| 亚洲国产天堂网精品网站| 亚洲第一视频在线观看| 亚洲一区二区免费在线| 欧美成人自拍视频| 欧美天天综合色影久久精品| 在线日韩中文字幕| 国产va免费精品高清在线| 韩国视频理论视频久久| 精品亚洲夜色av98在线观看| 日韩激情视频在线播放| 日韩精品免费在线视频| 国产91露脸中文字幕在线| 成人精品视频久久久久| 欧美成人h版在线观看| 国产精品v日韩精品| 成人av在线亚洲| 91日本在线观看| 亚洲欧美成人一区二区在线电影| 久久久精品在线| 最近2019好看的中文字幕免费| 国产成人免费av电影| 国产精品欧美一区二区| 亚洲国产精品成人av| 中文字幕免费精品一区| 久久久亚洲影院| 国产成人拍精品视频午夜网站| 国产精自产拍久久久久久| 麻豆国产va免费精品高清在线| 久久久久亚洲精品| 亚洲欧美成人一区二区在线电影| 日韩在线观看网址| 国产成人精品电影| 久久久www成人免费精品张筱雨| 国产91精品久久久久久久| 国产免费成人av| 国产区精品视频| 亚洲男人的天堂在线| 日韩hd视频在线观看| 欧美在线精品免播放器视频| 成人av资源在线播放| 亚洲综合一区二区不卡| 国产精品一二区| 欧美日韩综合视频| 国内精品免费午夜毛片| 日韩美女福利视频| 欧美亚洲成人网|