最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java原子類中的AtomicInteger類詳解

 更新時間:2023年10月24日 09:34:08   作者:liyong0829  
這篇文章主要介紹了Java原子類中的AtomicInteger類詳解,原子類可以保證對"變量"操作的,原子性、有序性、可見性,我們可以通過AtomicInteger類,來看看它們是怎樣工作的,需要的朋友可以參考下

原子類

在java.util.concurrent.atomic包下定義了一些對“變量”操作的“原子類”:

  • java.util.concurrent.atomic.AtomicInteger:對int變量操作的“原子類”;
  • java.util.concurrent.atomic.AtomicLong:對long變量操作的“原子類”;
  • java.util.concurrent.atomic.AtomicBoolean:對boolean變量操作的“原子類”;

它們可以保證對“變量”操作的:原子性、有序性、可見性。

AtomicInteger類示例

我們可以通過AtomicInteger類,來看看它們是怎樣工作的

//線程類:

public class MyThread extends Thread {
     //static int a = 0;
    static AtomicInteger a = new AtomicInteger();// 表示整數(shù)0

    @Override
    public void run() {
        for (int i = 0; i < 200000; i++) {
            // a++;
            a.getAndIncrement();
        }
        System.out.println("子線程執(zhí)行完畢");
    }
}

//測試類:

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

        // 案例:一條子線程和一條主線程都對共享變量a進行++操作,每條線程對a++操作400000次
        new MyThread().start();

        for (int i = 0; i < 200000; i++) {
            //MyThread.a++;
            MyThread.a.getAndIncrement();
        }

        // 為了保證子線程和主線程都執(zhí)行完畢
        Thread.sleep(3000);

        // 打印最終共享變量a的值(子線程,主線程對a的操作都執(zhí)行完畢了)
        System.out.println("最終:"+ MyThread.a.get());

  }
}

我們能看到,無論程序運行多少次,其結果總是正確的!

AtomicInteger類的工作原理-CAS機制

在這里插入圖片描述

AtomicIntegerArray類示例

常用的數(shù)組操作的原子類:

1).java.util.concurrent.atomic.AtomicIntegerArray:對int數(shù)組操作的原子類。 int[]

2).java.util.concurrent.atomic.AtomicLongArray:對long數(shù)組操作的原子類。long[]

3).java.util.concurrent.atomic.AtomicReferenceArray:對引用類型數(shù)組操作的原子類。Object[]

數(shù)組的多線程并發(fā)訪問的安全性問題:

//線程類:

public class MyThread extends Thread {
    public static int[] arr = new int[1000];

    @Override
    public void run() {
        for (int i = 0; i < arr.length(); i++) {
            arr[i]++;
        }
        System.out.println("結束");
    }
}

//測試類:

public class Demo {
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 1000; i++) {
            new MyThread().start();//創(chuàng)建1000個線程,每個線程為數(shù)組的每個元素+1
        }

        Thread.sleep(1000 * 5);//讓所有線程執(zhí)行完畢

        System.out.println("主線程休息5秒醒來");
        for (int i = 0; i < MyThread.arr.length; i++) {
            System.out.println(MyThread.arr[i]);
        }
    }
}

//正常情況,數(shù)組的每個元素最終結果應為:1000,而實際打?。?/p>

1000
1000
1000
1000
999
999
999
999
999
999
999
999
1000
1000
1000
1000

可以發(fā)現(xiàn),有些元素并不是1000.

//為保證數(shù)組的多線程安全,改用AtomicIntegerArray類,演示:

//線程類:

public class MyThread extends Thread {
 
    //改用原子類,使用數(shù)組構造
    public static AtomicIntegerArray arr = new AtomicIntegerArray(1000);
    @Override
    public void run() {
        for (int i = 0; i < arr.length(); i++) {
            arr.addAndGet(i, 1);//將i位置上的元素 + 1
        }
        System.out.println("結束");
    }
}

測試類 

  public class Demo {
      public static void main(String[] args) throws InterruptedException {
          for (int i = 0; i < 1000; i++) {
              new MyThread().start();
          }
          Thread.sleep(1000 * 5);//讓所有線程執(zhí)行完畢
  
          System.out.println("主線程休息5秒醒來");
          for (int i = 0; i < MyThread.arr.length(); i++) {
              System.out.println(MyThread.arr.get(i));
          }
      }
  }

先在能看到,每次運行的結果都是正確的。

到此這篇關于Java原子類中的AtomicInteger類詳解的文章就介紹到這了,更多相關Java的AtomicInteger類內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解決Mybatis-Plus中分頁插件Page中total=0的問題

    解決Mybatis-Plus中分頁插件Page中total=0的問題

    在使用Mybatis-Plus進行分頁查詢時,如果遇到`total=0`的情況,即使查詢到了數(shù)據(jù),也無法正確分頁,這通常是由于依賴版本問題導致的,對于低版本,需要手動配置分頁攔截器;對于高版本,可能需要添加特定的依賴配置來解決這個問題
    2025-11-11
  • Spring6當中獲取Bean的四種方式小結

    Spring6當中獲取Bean的四種方式小結

    Spring 為Bean 的獲取提供了多種方式,通常包括4種方式,(也就是說在Spring中為Bean對象的創(chuàng)建準備了多種方案,目的是:更加靈活),本文將通過代碼示例詳細的給大家介紹了一下這四種方式,需要的朋友可以參考下
    2024-04-04
  • Java中八大包裝類舉例詳解(通俗易懂)

    Java中八大包裝類舉例詳解(通俗易懂)

    這篇文章主要介紹了Java中的包裝類,包括它們的作用、特點、用途以及如何進行裝箱和拆箱,包裝類還提供了許多實用方法,如轉換、獲取基本類型值、比較和類型檢測,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-02-02
  • Springboot集成Spring Security實現(xiàn)JWT認證的步驟詳解

    Springboot集成Spring Security實現(xiàn)JWT認證的步驟詳解

    這篇文章主要介紹了Springboot集成Spring Security實現(xiàn)JWT認證的步驟詳解,幫助大家更好的理解和使用springboot,感興趣的朋友可以了解下
    2021-02-02
  • 在idea中git實現(xiàn)里查看歷史代碼方式

    在idea中git實現(xiàn)里查看歷史代碼方式

    這篇文章主要介紹了在idea中git里查看歷史代碼的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • SpringBoot使用Scheduling實現(xiàn)定時任務的示例代碼

    SpringBoot使用Scheduling實現(xiàn)定時任務的示例代碼

    Spring Boot提供了一種方便的方式來實現(xiàn)定時任務,即使用Spring的@Scheduled注解,通過在方法上添加@Scheduled注解,我們可以指定方法在何時執(zhí)行,本文我們就給大家介紹一下SpringBoot如何使用Scheduling實現(xiàn)定時任務,需要的朋友可以參考下
    2023-08-08
  • Springboot日志開啟SLF4J過程解析

    Springboot日志開啟SLF4J過程解析

    這篇文章主要介紹了Springboot日志開啟SLF4J過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Java中l(wèi)ist.contains()的用法及拓展

    Java中l(wèi)ist.contains()的用法及拓展

    List集合相信大家在開發(fā)過程中幾乎都會用到,有時候難免會遇到集合里的數(shù)據(jù)是重復的,需要進行去除,下面這篇文章主要給大家介紹了關于Java中l(wèi)ist.contains()的用法及拓展的相關資料,需要的朋友可以參考下
    2023-03-03
  • Springboot項目快速實現(xiàn)過濾器功能

    Springboot項目快速實現(xiàn)過濾器功能

    上篇文章已經給大家介紹了Springboot項目如何快速實現(xiàn)Aop功能,這篇文章給大家介紹Springboot項目如何快速實現(xiàn)過濾器功能,感興趣的小伙伴可以參考閱讀
    2023-03-03
  • macOS完全卸載Java開發(fā)環(huán)境詳細教程

    macOS完全卸載Java開發(fā)環(huán)境詳細教程

    Java開發(fā)環(huán)境的搭建是每一位Java程序員職業(yè)生涯的起點,其核心在于JDK(Java Development Kit)的正確安裝與系統(tǒng)級環(huán)境變量的精準配置,這篇文章主要介紹了macOS完全卸載Java開發(fā)環(huán)境的相關資料,需要的朋友可以參考下
    2026-01-01

最新評論

亳州市| 南宫市| 青州市| 平湖市| 吉林市| 北京市| 冷水江市| 海城市| 油尖旺区| 桂阳县| 永登县| 张北县| 将乐县| 丰台区| 高要市| 白城市| 特克斯县| 龙岩市| 建德市| 崇左市| 海阳市| 那曲县| 康乐县| 广河县| 桐柏县| 丹凤县| 谷城县| 方山县| 南靖县| 界首市| 汉川市| 定边县| 叶城县| 古丈县| 册亨县| 濉溪县| 江西省| 随州市| 金山区| 阜平县| 蒙自县|