Java原子類中的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進行分頁查詢時,如果遇到`total=0`的情況,即使查詢到了數(shù)據(jù),也無法正確分頁,這通常是由于依賴版本問題導致的,對于低版本,需要手動配置分頁攔截器;對于高版本,可能需要添加特定的依賴配置來解決這個問題2025-11-11
Springboot集成Spring Security實現(xiàn)JWT認證的步驟詳解
這篇文章主要介紹了Springboot集成Spring Security實現(xiàn)JWT認證的步驟詳解,幫助大家更好的理解和使用springboot,感興趣的朋友可以了解下2021-02-02
SpringBoot使用Scheduling實現(xiàn)定時任務的示例代碼
Spring Boot提供了一種方便的方式來實現(xiàn)定時任務,即使用Spring的@Scheduled注解,通過在方法上添加@Scheduled注解,我們可以指定方法在何時執(zhí)行,本文我們就給大家介紹一下SpringBoot如何使用Scheduling實現(xiàn)定時任務,需要的朋友可以參考下2023-08-08
Java中l(wèi)ist.contains()的用法及拓展
List集合相信大家在開發(fā)過程中幾乎都會用到,有時候難免會遇到集合里的數(shù)據(jù)是重復的,需要進行去除,下面這篇文章主要給大家介紹了關于Java中l(wèi)ist.contains()的用法及拓展的相關資料,需要的朋友可以參考下2023-03-03
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

