并發技術09】原子性操作類的使用

      網友投稿 706 2025-04-03

      方法,其中包含:

      1. 基本類型的使用

      首先看一下 AtomicInteger 的使用,AtomicInteger 主要是針對整數的修改的,看一下示例代碼:

      public class AtomicIntegerDemo {

      public final static AtomicInteger TEST_INTEGER = new AtomicInteger(1);

      public static void main(String []args) {

      for(int i = 0 ; i < 10 ; i++) { //開啟10個線程

      new Thread() {

      public void run() {

      try {

      Thread.sleep(1000);

      } catch (InterruptedException e) {

      e.printStackTrace();

      }

      int now = TEST_INTEGER.incrementAndGet(); //自增

      System.out.println(Thread.currentThread().getName() + " get value : " + now);

      }

      }.start();

      }

      【并發技術09】原子性操作類的使用

      來看一下結果:

      Thread-3 get value : 4

      Thread-7 get value : 5

      Thread-9 get value : 9

      Thread-4 get value : 6

      Thread-0 get value : 3

      Thread-1 get value : 8

      Thread-5 get value : 11

      Thread-8 get value : 7

      Thread-2 get value : 10

      Thread-6 get value : 2

      可以看出,10 個線程之間是線程安全的,并沒有沖突。也就是說,我們使用原子性操作類去操作基本類型 int 就可以解決線程安全問題,一個線程在操作的時候,會對其它線程進行排斥,不用我們手動去使用 synchronized 實現互斥操作了。AtomicLong 和 AtomicBoolean 類似,就不舉例子了。

      2. 數組類型的使用

      下面要開始說 Atomic 的數組用法,Atomic 的數組要求不允許修改長度等,不像集合類那么豐富的操作,不過它可以讓數組上每個元素的操作絕對安全的,也就是它細化的力度還是到數組上的元素,做了二次包裝,雖然是數組類型的,但是最后還是操作數組中存的數,所以會了上面的基本類型的話,數組類型也很好理解。這里主要看一下 AtomicIntegerArray 的使用,其它的類似。

      public class AtomicIntegerArrayTest {

      private final static AtomicIntegerArray ATOMIC_INTEGER_ARRAY = new AtomicIntegerArray(new int[]{1,2,3,4,5,6,7,8,9,10});

      public static void main(String []args) throws InterruptedException {

      Thread []threads = new Thread[10];

      for(int i = 0 ; i < 10 ; i++) {

      final int index = i;

      final int threadNum = i;

      threads[i] = new Thread() {

      public void run() {

      int result = ATOMIC_INTEGER_ARRAY.addAndGet(index, index + 1);

      System.out.println("線程編號為:" + threadNum + " , 對應的原始值為:" + (index + 1) + ",增加后的結果為:" + result);

      }

      };

      threads[i].start();

      }

      for(Thread thread : threads) {

      thread.join();

      }

      System.out.println("=========================>\n執行已經完成,結果列表:");

      for(int i = 0 ; i < ATOMIC_INTEGER_ARRAY.length() ; i++) {

      System.out.println(ATOMIC_INTEGER_ARRAY.get(i));

      }

      }

      }

      運行結果是給每個數組元素加上相同的值,它們之間互不影響。

      3. 作為類屬性的使用

      當某個數據類型是某個類中的一個屬性的時候,然后我們要操作該數據,就需要使用屬性原子修改器了,這里還是以 Integer 為例,即:AtomicIntegerFieldUpdater。示例代碼如下:

      public class AtomicIntegerFieldUpdaterTest {

      static class A {

      volatile int intValue = 100;

      }

      public final static AtomicIntegerFieldUpdater ATOMIC_INTEGER_UPDATER = AtomicIntegerFieldUpdater.newUpdater(A.class, "intValue");

      public static void main(String []args) {

      final A a = new A();

      for(int i = 0 ; i < 10 ; i++) {

      new Thread() {

      public void run() {

      if(ATOMIC_INTEGER_UPDATER.compareAndSet(a, 100, 120)) {

      System.out.println(Thread.currentThread().getName() + " 對對應的值做了修改!");

      }

      }

      }.start();

      }

      }

      }

      可以看到,這里需要將類和類屬性傳進去才行,傳進去后其實跟前面操作 Integer 沒什么不同了,本質都一樣的,運行一下,結果只有一個線程能對其進行修改。

      線程的原子性操作類的使用就簡單總結到這,其他的操作類原理都相似,可以參考 JDK 的文檔,可以很容易寫出相應的測試代碼。

      來源:微信公眾號

      任務調度 數據結構

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:怎樣卸載excel2007
      下一篇:WPS自動分頁符的隱藏方法
      相關文章
      久久丫精品国产亚洲av| 亚洲AV无码1区2区久久| 久久亚洲美女精品国产精品| 国产亚洲精品a在线观看| 无码一区二区三区亚洲人妻| 亚洲AV无码XXX麻豆艾秋| 亚洲国产成人综合精品| 亚洲精品一卡2卡3卡四卡乱码| 亚洲中文字幕无码爆乳app| 亚洲综合久久精品无码色欲| 亚洲香蕉在线观看| 亚洲免费视频观看| 亚洲AV一二三区成人影片| 亚洲av乱码一区二区三区香蕉| 亚洲乱码一二三四区麻豆| 亚洲www在线观看| 亚洲熟妇无码一区二区三区| 亚洲av永久无码天堂网| 国产亚洲精品欧洲在线观看| 无码不卡亚洲成?人片| 大胆亚洲人体视频| 亚洲人成无码久久电影网站| 亚洲欧洲日产国码无码久久99 | 亚洲乱码国产一区三区| 国产亚洲精午夜久久久久久| 亚洲乱码一区二区三区在线观看| 亚洲AV永久纯肉无码精品动漫| 精品久久久久久亚洲| 老色鬼久久亚洲AV综合| 亚洲国产精品无码久久久| 亚洲六月丁香婷婷综合| 亚洲综合激情五月色一区| 亚洲AV日韩AV一区二区三曲 | 亚洲天堂一区二区三区| 亚洲av无码久久忘忧草| 亚洲大码熟女在线观看| 亚洲美女在线国产| 国产成A人亚洲精V品无码性色 | 亚洲成年人电影网站| 亚洲一区AV无码少妇电影| 国产午夜亚洲精品不卡|