AtomicInteger類保證線程安全的用法


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

java多線程用法-使用AtomicInteger
下面通過簡單的兩個例子的對比來看一下 AtomicInteger 的強大的功能
class Counter {
private volatile int count = 0;

public synchronized void increment() {
count++;  //若要線程安全執行執行count++,需要加鎖
}

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。

  另外其底層就是volatile和CAS 共同作用的結果:

     1.首先使用了volatile 保證了內存可見性。

     2.然后使用了CAS(compare-and-swap)算法 保證了原子性。

       其中CAS算法的原理就是里面包含三個值:內存值A  預估值V  更新值 B  當且僅當 V == A 時,V = B; 否則,不會執行任何操作。

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM