Java原子性操作類應用

來源:互聯網
上載者:User

標籤:賦值   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原子性操作類應用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.