AtomicInteger解決線程同步的問題

內容轉載自csdn用戶:zz198808java

J2SE 5.0提供了一組atomic class來幫助咱們簡化同步處理。基本工做原理是使用了同步synchronized的方法實現了對一個long, integer, 對象的增、減、賦值(更新)操做. 好比對於++運算符AtomicInteger能夠將它持有的integer 可以atomic 地遞增。在須要訪問兩個或兩個以上 atomic變量的程序代碼(或者是對單一的atomic變量執行兩個或兩個以上的操做)一般都須要被synchronize以便二者的操做可以被看成是一個atomic的單元。

web

java多線程用法-使用AtomicInteger安全

下面經過簡單的兩個例子的對比來看一下 AtomicInteger 的強大的功能多線程

class Counter {併發

private volatile int count = 0;高併發


public synchronized void increment() {atom

count++;  //若要線程安全執行執行count++,須要加鎖spa

}.net


public int getCount() {線程

return count;

}

}


class Counter {

private AtomicInteger count = new AtomicInteger(); 


public void increment() {

count.incrementAndGet();

}

       //使用AtomicInteger以後,不須要加鎖,也能夠實現線程安全。

public int getCount() {

return count.get();

}

}


從上面的例子中咱們能夠看出:使用AtomicInteger是很是的安全的

那麼爲何不使用記數器自加呢,例如count++這樣的,由於這種計數是線程不安全的,高併發訪問時統計會有誤,而AtomicInteger爲何可以達到多而不亂,處理高併發應付自如呢?

這是由硬件提供原子操做指令實現的。在非激烈競爭的狀況下,開銷更小,速度更快。Java.util.concurrent中實現的原子操做類包括:

AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference。

相關文章
相關標籤/搜索