Java並發學習筆記(九)-原子類AtomicInteger

來源:互聯網
上載者:User

標籤:atomicinteger   原子類   並發   violate   compareandset   

AtomicInteger能夠保證對一個整型的操作是原子性。像i++這個操作不是原子操作,存在競態條件,所以需要加鎖,但是加鎖的效能不高,如果僅僅為了對一個整數加1。我們來看下他的實現。

    private volatile int value;

AtomicInteger本身持有一個整型變數,所有的操作都是基於這個變數的。變數由violate修飾,這個變數是保證可見度的,具體可見另一篇部落格

Java並發學習筆記(六)-互斥性和記憶體可見度。

來看一下對value加1的操作

    public final int getAndIncrement() {        for (;;) {            int current = get();            int next = current + 1;            if (compareAndSet(current, next))                return current;        }    }

代碼嵌套在一個for迴圈裡,關鍵是在compareAndSet方法裡。這個方法會託管給unsafe的compareAndSwapInt方法,這個步驟是靠硬體支援的,是原子操作。這個方法的意思是,如果value等於current,那麼將value置為next,返回true,否則返回false,繼續下一輪迴圈。為什麼會出現值不一致,原因就在競態條件,當本線程將value值賦給current後,其它線程可能修改了value的值,這樣就會出現current和value不一致的情況。可以看出來compareAndSet類似樂觀鎖,及時失敗。總結來說就是,value的可見度由voilate保證,原子性操作由compareAndSet來保證。

其它的方法,操作也類似,都是依靠compareAndSet來保證


Java並發學習筆記(九)-原子類AtomicInteger

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.