摘要:先比較,發(fā)現(xiàn)與預期一致,說明沒有其他線程改動過,于是就交換如果不一致說明改動過,就再來一次,如此往復。所謂無鎖是在層面上沒有鎖,但其實在操作系統(tǒng)的指令層面是加了鎖的。這個鎖比上的鎖性能好很多。
CAS(CompareAndSwap)顧名思義比較再交換。先比較,發(fā)現(xiàn)與預期一致,說明沒有其他線程改動過,于是就交換;如果不一致說明改動過,就再來一次,如此往復。
int prev, next; do { prev = get(); next = accumulatorFunction.applyAsInt(prev, x); } while (!compareAndSet(prev, next)); return next;
這是一種自旋的方式保證線程安全,可是compareAndSet這個比較再交換是原子的嗎?先比較發(fā)現(xiàn)與預期一致了,準備交換的時候另一個線程來改了怎么辦?
點進去看源碼:
public final boolean compareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update); }
這個unsafe的方法都是native方法,
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
只能打開openJDK看源碼了
UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) UnsafeWrapper("Unsafe_CompareAndSwapInt"); oop p = JNIHandles::resolve(obj); jint* addr = (jint *) index_oop_from_field_offset_long(p, offset); return (jint)(Atomic::cmpxchg(x, addr, e)) == e; UNSAFE_END
核心方法是cmpxchg方法
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 } }
原來LOCK_IF_MP這里加了鎖,才保證了原子性。所謂“無鎖”是在Java層面上沒有鎖,但其實在操作系統(tǒng)的CPU指令層面是加了鎖的。這個鎖比java上的鎖性能好很多。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/75080.html
摘要:每一個被鎖住的對象都會和一個關聯(lián)對象頭的中的指向的起始地址,同時中有一個字段存放擁有該鎖的線程的唯一標識,表示該鎖被這個線程占用。 jdk 6 對鎖進行了優(yōu)化,讓他看起來不再那么笨重,synchronized有三種形式:偏向鎖,輕量級鎖,重量級鎖. 介紹三種鎖之前,引入幾個接下來會出現(xiàn)的概念 mark work: 對象頭,對象頭中存儲了一些對象的信息,這個是鎖的根本,任何鎖都需要依賴m...
摘要:前情提要深入理解內存模型四鎖的釋放獲取建立的關系鎖是并發(fā)編程中最重要的同步機制。鎖內存語義的實現(xiàn)本文將借助的源代碼,來分析鎖內存語義的具體實現(xiàn)機制。請看下篇深入理解內存模型六 前情提要 深入理解Java內存模型(四)—— volatile 鎖的釋放-獲取建立的happens before 關系 鎖是java并發(fā)編程中最重要的同步機制。鎖除了讓臨界區(qū)互斥執(zhí)行外,還可以讓釋放鎖的線程向...
摘要:鎖的部分細節(jié)不同場景鎖的表現(xiàn)不同獨占共享讀寫分布式鎖的簡單實現(xiàn)分布式鎖實現(xiàn)的三個核心要素加鎖最簡單的方法是使用命令。嘗試獲取分布式鎖客戶端鎖線程超期時間是否獲取成功釋放分布式鎖客戶端鎖請求標識是否釋放成功 鎖的由來: 多線程環(huán)境中,經常遇到多個線程訪問同一個 共享資源 ,這時候作為開發(fā)者必須考慮如何維護數(shù)據(jù)一致性,這就需要某種機制來保證只有滿足某個條件(獲取鎖成功)的線程才能訪問資源...
摘要:第三天,太監(jiān)傳話欽天監(jiān)求見一日無事。第四天,欽天監(jiān)一日無事。然后所有的競爭線程放棄自旋,逐個插入到對象里的一個隊列尾部,進入阻塞狀態(tài)。 微信公眾號:IT一刻鐘大型現(xiàn)實非嚴肅主義現(xiàn)場一刻鐘與你分享優(yōu)質技術架構與見聞,做一個有劇情的程序員關注可第一時間了解更多精彩內容,定期有福利相送喲。 showImg(https://segmentfault.com/img/bVbrgsJ?w=900...
閱讀 2589·2021-11-23 09:51
閱讀 3385·2021-11-22 15:22
閱讀 1903·2021-11-18 13:22
閱讀 2319·2021-09-24 09:48
閱讀 1338·2019-08-29 13:58
閱讀 1332·2019-08-26 13:39
閱讀 2474·2019-08-26 10:48
閱讀 3063·2019-08-26 10:21