成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

CAS也是鎖

Flands / 2929人閱讀

摘要:先比較,發(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

相關文章

  • Java 中關于鎖的一些理解

    摘要:每一個被鎖住的對象都會和一個關聯(lián)對象頭的中的指向的起始地址,同時中有一個字段存放擁有該鎖的線程的唯一標識,表示該鎖被這個線程占用。 jdk 6 對鎖進行了優(yōu)化,讓他看起來不再那么笨重,synchronized有三種形式:偏向鎖,輕量級鎖,重量級鎖. 介紹三種鎖之前,引入幾個接下來會出現(xiàn)的概念 mark work: 對象頭,對象頭中存儲了一些對象的信息,這個是鎖的根本,任何鎖都需要依賴m...

    Yumenokanata 評論0 收藏0
  • 深入理解Java內存模型(五)——鎖

    摘要:前情提要深入理解內存模型四鎖的釋放獲取建立的關系鎖是并發(fā)編程中最重要的同步機制。鎖內存語義的實現(xiàn)本文將借助的源代碼,來分析鎖內存語義的具體實現(xiàn)機制。請看下篇深入理解內存模型六 前情提要 深入理解Java內存模型(四)—— volatile 鎖的釋放-獲取建立的happens before 關系 鎖是java并發(fā)編程中最重要的同步機制。鎖除了讓臨界區(qū)互斥執(zhí)行外,還可以讓釋放鎖的線程向...

    caige 評論0 收藏0
  • 鎖和分布式鎖

    摘要:鎖的部分細節(jié)不同場景鎖的表現(xiàn)不同獨占共享讀寫分布式鎖的簡單實現(xiàn)分布式鎖實現(xiàn)的三個核心要素加鎖最簡單的方法是使用命令。嘗試獲取分布式鎖客戶端鎖線程超期時間是否獲取成功釋放分布式鎖客戶端鎖請求標識是否釋放成功 鎖的由來: 多線程環(huán)境中,經常遇到多個線程訪問同一個 共享資源 ,這時候作為開發(fā)者必須考慮如何維護數(shù)據(jù)一致性,這就需要某種機制來保證只有滿足某個條件(獲取鎖成功)的線程才能訪問資源...

    codeGoogle 評論0 收藏0
  • 且聽我一個故事講透一個鎖原理之synchronized

    摘要:第三天,太監(jiān)傳話欽天監(jiān)求見一日無事。第四天,欽天監(jiān)一日無事。然后所有的競爭線程放棄自旋,逐個插入到對象里的一個隊列尾部,進入阻塞狀態(tài)。 微信公眾號:IT一刻鐘大型現(xiàn)實非嚴肅主義現(xiàn)場一刻鐘與你分享優(yōu)質技術架構與見聞,做一個有劇情的程序員關注可第一時間了解更多精彩內容,定期有福利相送喲。 showImg(https://segmentfault.com/img/bVbrgsJ?w=900...

    gougoujiang 評論0 收藏0

發(fā)表評論

0條評論

Flands

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<