標籤:賦值 rem override microsoft 開啟3個線程 調用 條件 turn rgs
Java5的線程並發庫中,提供了一組atomic class來協助我們簡化同步處理。基本工作原理是使用了同步synchronized的方法實現了對一個long, integer, 對象的增、減、賦值(更新)操作
java.util.concurrent在並發編程中很常用的工具 + 生產力類。
|----locks為鎖和等待條件提供一個架構的介面和類,它不同於內建同步和監視器
|----atomic類的小工具包,支援在單個變數上解除鎖的安全執行緒編程。可以對基本類型、數組中的基本類型、類中的基本類型等進行操作
|----AtomicInteger 用於提供整型數字原子性操作
|----AtomicIntegerArray 用於提供整型數組原子性操作
|----AtomicIntegerFieldUpdater 用於提供類對象中的整型資料原子性操作
...... 對應有Double...相類似的原子性操作類
以上原子性操作類具體如何使用詳情可以查看相應的官方jdk文檔,下面通過簡單的兩個例子的對比來看一下 AtomicInteger 的強大的功能,分別是普通的方法與使用AtomicInteger類的方法:
普通方法實現方案:
1 public class CommonTest { 2 private volatile int count = 0; //volatile關鍵字實現線程間資料共用 3 4 public synchronized void increment() { 5 count++; //若要安全執行緒執行,需要加鎖 6 } 7 8 public int getCount() { 9 return count;10 }11 }
使用AtomicInteger類的方法實現
1 public class AtomicIntegerTest { 2 private AtomicInteger count = new AtomicInteger(); 3 4 public synchronized void increment() { 5 count.incrementAndGet(); 6 } 7 8 public int getCount() { 9 return count.get();10 }11 }
調用兩個類的主方法實現
1 public class MainClass { 2 public static void main(String[] args) { 3 //final CommonTest atomicIntegerTest = new CommonTest(); 4 final AtomicIntegerTest atomicIntegerTest = new AtomicIntegerTestTrue(); 5 for (int j = 0; j < 3; j++) { //各自同時開啟3個線程 6 //增加線程 7 new Thread(new Runnable() { 8 @Override 9 public void run() {10 for (int i = 0; i < 10; i++) {11 atomicIntegerTest.increment();12 try {13 Thread.sleep(1000);14 } catch (InterruptedException e) {15 e.printStackTrace();16 }17 }18 }19 }).start();20 //讀取線程21 new Thread(new Runnable() {22 @Override23 public void run() {24 for (int i = 0; i < 10; i++) {25 System.out.println(Thread.currentThread().getName() + "-->" + atomicIntegerTest.getCount());26 try {27 Thread.sleep(1000);28 } catch (InterruptedException e) {29 e.printStackTrace();30 }31 }32 }33 }).start();34 }35 }36 }
運行結果如下所示:
Thread-1-->1Thread-3-->2Thread-5-->3Thread-3-->4Thread-1-->5Thread-5-->5Thread-1-->9Thread-5-->9Thread-3-->9Thread-5-->12Thread-3-->12Thread-1-->12Thread-3-->13Thread-1-->13Thread-5-->14Thread-5-->16Thread-1-->16Thread-3-->16Thread-1-->21Thread-3-->21Thread-5-->21Thread-5-->22Thread-1-->22Thread-3-->22Thread-1-->25Thread-5-->25Thread-3-->25Thread-3-->29Thread-1-->30Thread-5-->29
從上面的例子中我們可以看出:使用AtomicInteger是非常的安全的
那麼為什麼不使用記數器自加呢,例如count++這樣的,因為這種計數是線程不安全的,高並發訪問時統計會有誤,而AtomicInteger為什麼能夠達到多而不亂,處理高並發應付自如呢?
這是由硬體提供原子操作指令實現的。在非激烈競爭的情況下,開銷更小,速度更快。
Java原子性操作類應用