欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Java性能--CAS樂(lè)觀鎖-創(chuàng)新互聯(lián)

synchronized / Lock / CAS

  1. synchronized和Lock實(shí)現(xiàn)的同步鎖機(jī)制,都屬于悲觀鎖,而CAS屬于樂(lè)觀鎖
  2. 悲觀鎖在高并發(fā)的場(chǎng)景下,激烈的鎖競(jìng)爭(zhēng)會(huì)造成線程阻塞,而大量阻塞線程會(huì)導(dǎo)致系統(tǒng)的上下文切換,增加系統(tǒng)的性能開銷

樂(lè)觀鎖

  1. 樂(lè)觀鎖:在操作共享資源時(shí),總是抱著樂(lè)觀的態(tài)度進(jìn)行,認(rèn)為自己能夠完成操作
  2. 但實(shí)際上,當(dāng)多個(gè)線程同時(shí)操作一個(gè)共享資源時(shí),只有一個(gè)線程會(huì)成功,失敗的線程不會(huì)被掛起,僅僅只是返回
  3. 樂(lè)觀鎖相比于悲觀鎖來(lái)說(shuō),不會(huì)帶來(lái)死鎖、饑餓等活性故障問(wèn)題,線程間的相互影響也遠(yuǎn)遠(yuǎn)比悲觀鎖要小
    • 樂(lè)觀鎖沒(méi)有因競(jìng)爭(zhēng)而造成的系統(tǒng)上下文切換,所以在性能上更勝一籌

實(shí)現(xiàn)原理

  1. CAS是實(shí)現(xiàn)樂(lè)觀鎖的核心算法,包含3個(gè)參數(shù):V(需要更新的變量),E(預(yù)期值)、N(最新值)
  2. 只有V等于E時(shí),V才會(huì)被設(shè)置為N
  3. 如果V不等于E了,說(shuō)明其它線程已經(jīng)更新了V,此時(shí)該線程不做操作,返回V的真實(shí)值

CAS實(shí)現(xiàn)原子操作

AtomicInteger是基于CAS實(shí)現(xiàn)的一個(gè)線程安全的整型類,Unsafe調(diào)用CPU底層指令實(shí)現(xiàn)原子操作

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、虛擬空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、邕寧網(wǎng)站維護(hù)、網(wǎng)站推廣。
// java.util.concurrent.atomic.AtomicInteger
public final int getAndIncrement() {
    return unsafe.getAndAddInt(this, valueOffset, 1);
}

public final int getAndDecrement() {
    return unsafe.getAndAddInt(this, valueOffset, -1);
}
// sun.misc.Unsafe
public final int getAndAddInt(Object o, long offset, int delta) {
    int v;
    do {
        v = getIntVolatile(o, offset);
    } while (!compareAndSwapInt(o, offset, v, v + delta));
    return v;
}

public native int     getIntVolatile(Object o, long offset);

public final native boolean compareAndSwapInt(Object o, long offset, int expected, int x);

處理器實(shí)現(xiàn)原子操作

  1. CAS是調(diào)用處理器底層指令來(lái)實(shí)現(xiàn)原子操作的
  2. 處理器和物理內(nèi)存之間的通信速度要遠(yuǎn)低于處理器間的處理速度,所以處理器有自己的內(nèi)部緩存(L1/L2/L3)
  3. 服務(wù)器通常為多處理器,并且處理器是多核的,每個(gè)處理器維護(hù)了一塊字節(jié)的緩存存,每個(gè)內(nèi)核也維護(hù)了一塊字節(jié)的緩存
    • 此時(shí)在多線程并發(fā)就會(huì)存在緩存不一致的問(wèn)題,從而導(dǎo)致數(shù)據(jù)不一致
  4. 處理器提供了總線鎖定緩存鎖定兩種機(jī)制來(lái)保證復(fù)雜內(nèi)存操作的原子性
    • 總線鎖定
      • 當(dāng)處理器要操作一個(gè)共享變量時(shí),會(huì)在總線上會(huì)發(fā)出一個(gè)Lock信號(hào),此時(shí)其它處理器就不能操作共享變量了
      • 總線鎖定在阻塞其他處理器獲取該共享變量的操作請(qǐng)求時(shí),也可能會(huì)導(dǎo)致大量阻塞,從而增加系統(tǒng)的性能開銷
    • 緩存鎖定(后來(lái)出現(xiàn))
      • 當(dāng)某個(gè)處理器對(duì)緩存中的共享變量進(jìn)行了操作,就會(huì)通知其他處理器放棄存儲(chǔ)或者重新讀取該共享變量
      • 目前最新的處理器都支持緩存鎖定機(jī)制

Java性能 -- CAS樂(lè)觀鎖

優(yōu)化CAS樂(lè)觀鎖

  1. 樂(lè)觀鎖在并發(fā)性能上要優(yōu)于悲觀鎖
    • 但在寫大于讀的操作場(chǎng)景下,CAS失敗的可能性增大,如果循環(huán)CAS,會(huì)長(zhǎng)時(shí)間占用CPU
    • 例如上面的AtomicInteger#getAndIncrement
  2. JDK 1.8中,提供了新的原子類LongAdder
    • LongAdder在高并發(fā)場(chǎng)景下會(huì)比AtomicInteger和AtomicLong的性能更好,代價(jià)是消耗更多的內(nèi)存空間
      • 核心思想:空間換時(shí)間
      • 實(shí)現(xiàn)原理:降低操作共享變量的并發(fā)數(shù)
    • LongAdder內(nèi)部由一個(gè)base變量和一個(gè)cell[]數(shù)組組成
      • 當(dāng)只有一個(gè)寫線程(沒(méi)有競(jìng)爭(zhēng)
        • LongAdder會(huì)直接使用base變量作為原子操作變量,通過(guò)CAS操作修改base變量
      • 當(dāng)有多個(gè)寫線程(存在競(jìng)爭(zhēng)
        • 除了占用base變量的一個(gè)寫線程外,其他寫線程的value值會(huì)分散到cell數(shù)組中
        • 不同線程會(huì)命中到數(shù)組的不同槽中,各個(gè)線程只對(duì)自己槽中的value進(jìn)行CAS操作
        • value=base+∑ni=0Cell[i]
    • LongAdder在操作后的返回值只是一個(gè)近似準(zhǔn)確的值,但最終返回的是一個(gè)準(zhǔn)確的值
      • LongAdder不適合實(shí)時(shí)性要求較高的場(chǎng)景

性能對(duì)比

Java性能 -- CAS樂(lè)觀鎖

  1. 讀大于寫,讀寫鎖ReentrantReadWriteLock、讀寫鎖StampedLock、樂(lè)觀鎖LongAdder的性能最好
  2. 寫大于讀,樂(lè)觀鎖的性能最好,其他四種鎖的性能差不多
  3. 讀約等于寫,兩種讀寫鎖和樂(lè)觀鎖的性能要優(yōu)于synchronized和Lock

小結(jié)

  1. 樂(lè)觀鎖的常見(jiàn)使用場(chǎng)景:數(shù)據(jù)庫(kù)更新
    • 為每條數(shù)據(jù)定義一個(gè)版本號(hào),在更新前獲取版本號(hào),在更新數(shù)據(jù)時(shí),再判斷版本號(hào)是否被更新過(guò),如果沒(méi)有才更新數(shù)據(jù)
  2. CAS樂(lè)觀鎖的使用比較受限,因?yàn)闃?lè)觀鎖只能保證單個(gè)變量操作的原子性
  3. CAS樂(lè)觀鎖在高并發(fā)寫大于讀的場(chǎng)景下
    • 大部分線程的原子操作會(huì)失敗,失敗后的線程將不斷重試CAS原子操作,導(dǎo)致大量線程長(zhǎng)時(shí)間占用CPU資源
    • JDK 1.8中,新增了原子類LongAdder,采用空間換時(shí)間的思路解決了這個(gè)問(wèn)題,但實(shí)時(shí)性不高

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前題目:Java性能--CAS樂(lè)觀鎖-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://chinadenli.net/article22/ddeicc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、全網(wǎng)營(yíng)銷推廣企業(yè)建站、定制開發(fā)定制網(wǎng)站、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作