亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

【Java并發(fā)編程的藝術(shù)】第二章讀書筆記之原子操作

olle / 3520人閱讀

摘要:前言今天的筆記來了解一下原子操作以及中如何實(shí)現(xiàn)原子操作。概念原子本意是不能被進(jìn)一步分割的最小粒子,而原子操作意為不可被中斷的一個(gè)或一系列操作。處理器實(shí)現(xiàn)原子操作處理器會(huì)保證基本內(nèi)存操作的原子性。

前言

今天的筆記來了解一下原子操作以及Java中如何實(shí)現(xiàn)原子操作。

概念

原子(atomic)本意是“不能被進(jìn)一步分割的最小粒子”,而原子操作(atomic operation)意為“不可被中斷的一個(gè)或一系列操作”。

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

處理器會(huì)保證基本內(nèi)存操作的原子性。處理器保證從系統(tǒng)內(nèi)存中讀取或者寫入一個(gè)字節(jié)是原子的,意思是當(dāng)一個(gè)處理器讀取一個(gè)字節(jié)時(shí),其他處理器不能訪問這個(gè)字節(jié)的內(nèi)存地址。最新的處理器能自動(dòng)保證單處理器進(jìn)行16/32/64位的操作是原子的,并且提供總線鎖定和緩存鎖定兩個(gè)機(jī)制來保證復(fù)雜內(nèi)存操作的原子性。

使用總線保證原子性

如果有多個(gè)處理器同時(shí)對(duì)共享變量進(jìn)行操作,那么共享變量就會(huì)被多個(gè)處理器同時(shí)操作,這樣的話,讀改寫操作就不是原子的。
比如i=1,i++,兩個(gè)處理器同時(shí)進(jìn)行操作,最后的結(jié)果,可能是3,也可能是3.
原因可能是多個(gè)處理器同時(shí)從各自的緩存中讀取變量i,分別進(jìn)行加1操作,然后分別寫入系統(tǒng)內(nèi)存。
處理器使用總線鎖來解決這個(gè)問題。當(dāng)處理器發(fā)出LOCK#信號(hào)時(shí),其他處理器的請(qǐng)求會(huì)被阻塞主,該處理器可以獨(dú)占共享內(nèi)存。

使用緩存鎖定來保證原子性

鎖總線開銷還是很大的,鎖住了CPU和內(nèi)存之間的通信。
因?yàn)轭l繁使用的內(nèi)存會(huì)緩存在處理器的L1、L2、L3高速緩存中,原子操作可以在緩存內(nèi)部完成,同時(shí)通過緩存一致性協(xié)議,當(dāng)A處理器修改緩存中的i時(shí),其他處理器不能同時(shí)緩存i,即會(huì)使得其他處理器中對(duì)于共享變量的緩存失效。
這段還不是特別明白,感覺得重新翻一下操作系統(tǒng),有知道的網(wǎng)友可以留言補(bǔ)充一下。

Java實(shí)現(xiàn)原子操作的方式

Java可以使用鎖,實(shí)現(xiàn)一段代碼的原子操作。但這樣開銷比較大,會(huì)引起頻繁的上下文切換。
另外一種方式就是使用CAS操作(比較交換)。
CAS算法的過程是比較簡(jiǎn)單的。它會(huì)包含三個(gè)參數(shù)(V,E,N))。V表示要更新的變量,E表示預(yù)期值,N值。當(dāng)且僅當(dāng)V等于E值時(shí),才會(huì)將V的值設(shè)為N,如果V值和E值不同,說明已經(jīng)有其他線程做了更新,則當(dāng)前線程什么都不做。
當(dāng)多個(gè)線程同時(shí)使用CAS對(duì)變量進(jìn)行操作時(shí),只有一個(gè)會(huì)勝出并成功更新,其余會(huì)失敗。失敗的線程不會(huì)被掛起。
Java中對(duì)于基本類型的包裝類都有對(duì)應(yīng)的原子操作實(shí)現(xiàn),比如
AtomicBoolean
AtomicInteger

如果拿AtomicInteger為例子,其中的incrementAndGet的實(shí)現(xiàn)如下所示,是直接調(diào)用了Unsafe類的方法:

 public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

其中var1是傳入對(duì)象的引用,var2是字段到對(duì)象頭部的偏移量,方便快速定位,var5是當(dāng)前值,var5+var4就是期望值,var4傳入的是1。
如果是引用類型的話,可以使用AtomicReference。
CAS操作雖好,但它會(huì)遇到ABA問題,即一個(gè)變量先是A,后來變成了B,在比較時(shí)又變回了A,但CAS操作無法感知到這種情況,如果說我們是否可以修改當(dāng)前值,不僅取決于當(dāng)前值,還取決于它的變化,那么原有的CAS操作就無能為力了,因?yàn)樗兄坏健?br>貼心的JDK為我們提供了AtomicStampedReference,它在對(duì)象內(nèi)部維護(hù)了時(shí)間戳,當(dāng)更新數(shù)據(jù)時(shí),不僅要更新數(shù)據(jù),還要更新時(shí)間戳。當(dāng)AtomicStampedReference設(shè)置對(duì)象值時(shí),對(duì)象值以及時(shí)間戳都必須滿足期望值,寫入才會(huì)成功。
如果是數(shù)組類型的話,JDK提供了AtomicIntegerArray等數(shù)組類型的原子類。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/70559.html

相關(guān)文章

  • Java并發(fā)編程藝術(shù)二章讀書筆記volatile關(guān)鍵字

    摘要:目前看的部分主要是這個(gè)關(guān)鍵字。語言提供了,保證了所有線程能看到共享變量最新的值。前綴的指令在多核處理器下會(huì)做兩件事情將當(dāng)前處理器緩存行的數(shù)據(jù)寫回到系統(tǒng)內(nèi)存。 這一章節(jié)的話,主要是講一下在并發(fā)操作中常見的volatile、synchronized以及原子操作的相關(guān)知識(shí)。 目前看的部分主要是volatile這個(gè)關(guān)鍵字。 volatile 根據(jù)Java語言規(guī)范第3版中對(duì)volatile的定義...

    szysky 評(píng)論0 收藏0
  • Java并發(fā)編程藝術(shù)二章讀書筆記synchronized關(guān)鍵字

    摘要:在之前的文章中學(xué)習(xí)了關(guān)鍵字,可以保證變量在線程間的可見性,但他不能真正的保證線程安全。線程執(zhí)行到指令時(shí),將會(huì)嘗試獲取對(duì)象所對(duì)應(yīng)的的所有權(quán),即嘗試獲得對(duì)象的鎖。從可見性上來說,線程通過持有鎖的方式獲取變量的最新值。 在之前的文章中學(xué)習(xí)了volatile關(guān)鍵字,volatile可以保證變量在線程間的可見性,但他不能真正的保證線程安全。 /** * @author cenkailun *...

    GT 評(píng)論0 收藏0
  • Java并發(fā)編程藝術(shù)】第一章讀書筆記

    摘要:前言并發(fā)編程的目的是讓程序跑的更快,但并不是啟動(dòng)更多的線程,這個(gè)程序就跑的更快。盡可能降低上下文切換的次數(shù),有助于提高并發(fā)效率。死鎖并發(fā)編程中的另一挑戰(zhàn)是死鎖,會(huì)造成系統(tǒng)功能不可用。 前言 并發(fā)編程的目的是讓程序跑的更快,但并不是啟動(dòng)更多的線程,這個(gè)程序就跑的更快。有以下幾種挑戰(zhàn)。 挑戰(zhàn)及方案 上下文切換 單核CPU上執(zhí)行多線程任務(wù),通過給每個(gè)線程分配CPU時(shí)間片的方式來實(shí)現(xiàn)這個(gè)機(jī)制。...

    馬忠志 評(píng)論0 收藏0
  • 那些年我看過書 —— 致敬我大學(xué)生活 —— Say Good Bye !

    摘要:開頭正式開啟我入職的里程,現(xiàn)在已是工作了一個(gè)星期了,這個(gè)星期算是我入職的過渡期,算是知道了學(xué)校生活和工作的差距了,總之,盡快習(xí)慣這種生活吧。當(dāng)時(shí)是看的廖雪峰的博客自己也用做爬蟲寫過幾篇博客,不過有些是在前人的基礎(chǔ)上寫的。 showImg(https://segmentfault.com/img/remote/1460000010867984); 開頭 2017.08.21 正式開啟我...

    xiaoqibTn 評(píng)論0 收藏0
  • 【J2SE】java并發(fā)編程實(shí)戰(zhàn) 讀書筆記( 一、二、三章)

    摘要:發(fā)布的對(duì)象內(nèi)部狀態(tài)可能會(huì)破壞封裝性,使程序難以維持不變性條件。不變性線程安全性是不可變對(duì)象的固有屬性之一??勺儗?duì)象必須通過安全方式來發(fā)布,并且必須是線程安全的或者有某個(gè)鎖保護(hù)起來。 線程的優(yōu)缺點(diǎn) 線程是系統(tǒng)調(diào)度的基本單位。線程如果使用得當(dāng),可以有效地降低程序的開發(fā)和維護(hù)等成本,同時(shí)提升復(fù)雜應(yīng)用程序的性能。多線程程序可以通過提高處理器資源的利用率來提升系統(tǒng)的吞吐率。與此同時(shí),在線程的使用...

    QLQ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<