廖雪峯Java11多線程編程-3高級concurrent包-5Atomic

1. Atomic

java.util.concurrent.atomic提供了一組原子類型操做。如AtomicInteger提供了java

int addAndGet(int delta)
    int incrementAndGet()
    int get()
    int compareAndGet()

1.1 無鎖線程安全

Atomic類能夠實現<font color="blue">無鎖(lock-free)的線程安全(thread-safe)訪問</font>編程

<p style="color: red;background-color: yellow">原理:CAS(Compare and Set)若是AtomicInteger實例的值是prev,就替換爲next,返回true;不然,返回false</p> ```#java /* * 在這個操做中,若是AtomicInteger當前的值是prev,就更新爲next,返回true,終止循環; * 若是AtomicInteger當前的值不等於prev,就什麼也不作,返回false,繼續循環。 */ public int add1AndGet(AtomicInteger var){ int prev, next; do{ prev = var.get(); //以後其餘的線程修改了prev的值,也不影響結果 next = prev + 1; }while ( ! var.compareAndSet(prev, next)); return prev; } ``` 利用CAS操做,能夠保證,即時在do while循環中,其餘的線程在prev = var.get()後修改了AtomicInteger的值,最終結果也必定是正確的。 ### 1.2 incrementAndGet 一般不須要直接使用do...while..來調用compileAndGet,而是用incrementAndGet()這種封裝的方法。 ```#java AtomicLong var = new AtomicLong(0); public long getNextId(){ //多線程安全的id序列生成器 return var.incrementAndGet(); } ``` ## 2.示例 ```#java import java.util.concurrent.atomic.AtomicInteger;安全

class Counter{ private AtomicInteger value = new AtomicInteger(); //add、dec、get再也不使用synchronized或ReentrantLock加鎖,由於Atomic自己就是原子操做 public int add(int m){ return this.value.addAndGet(m); } public int dec(int m){ return this.value.addAndGet(-m); } public int get(){ return this.value.get(); } } public class Main{ final static int LOOP = 100; public static void main(String[] args) throws InterruptedException{ Counter counter = new Counter(); Thread t1 = new Thread(){ public void run(){ for(int i=0;i<LOOP;i++) { counter.add(1); } } }; Thread t2 = new Thread(){ public void run(){ for(int i=0;i<LOOP;i++){ counter.dec(1); } } }; t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(counter.get()); System.out.println("END"); } }多線程

<img src="https://img2018.cnblogs.com/blog/1418970/201906/1418970-20190613170947374-25418412.png" width="500" />

##    3.總結:
使用java.util.atomic提供的原子操做能夠簡化多線程編程
*    AtomicInteger/AtomicLong/AtomicArray
*    原子操做實現了無鎖的線程安全
*    適用於計數器、累加器
相關文章
相關標籤/搜索