1. 概述
鎖是Java并發編程中最重要的同步機制。鎖除了讓臨界區互斥執行外,還可以讓釋放鎖的線程獲取同一個鎖的線程發送消息。
鎖在實際使用時只是明白鎖限制了并發訪問, 但是鎖是如何實現并發訪問的, 同學們可能不太清楚, 下面這篇文章就來揭開鎖的神秘面紗.
2. 鎖的內存語義
鎖的內存語義與volatile的內存語義
內存語義總結
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前綴的說明如下.
上面的第2點和第3點所具有的內存屏障效果, 足以同時實現volatile讀和volatile寫的內存語義.
經過上面的分析, 現在我們終于能明白為什么JDK文檔說CAS同時具有volatile讀和volatile寫的內存語義了.
從本文對ReentrantLock的分析可以看出, 鎖釋放-獲取的內存語義的實現至少有下面兩種方式.
4. 總結
對于鎖, 可以這么理解, N個線程去通過CAS去修改一個volatile變量, 但是由于CPU提供的機制, 只能有一個線程修改成功, 修改成功的線程獲得鎖, 其它線程以及后來的線程要么自旋一會兒, 要么直接掛起, 等待獲取鎖的線程釋放鎖時去喚醒. 就是這么個過程.
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。
新聞熱點
疑難解答
圖片精選