Java原子類中的AtomicInteger類詳解
原子類
在java.util.concurrent.atomic包下定義了一些對(duì)“變量”操作的“原子類”:
- java.util.concurrent.atomic.AtomicInteger:對(duì)int變量操作的“原子類”;
- java.util.concurrent.atomic.AtomicLong:對(duì)long變量操作的“原子類”;
- java.util.concurrent.atomic.AtomicBoolean:對(duì)boolean變量操作的“原子類”;
它們可以保證對(duì)“變量”操作的:原子性、有序性、可見(jiàn)性。
AtomicInteger類示例
我們可以通過(guò)AtomicInteger類,來(lái)看看它們是怎樣工作的
//線程類:
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í)行完畢");
}
}
//測(cè)試類:
public class Test {
public static void main(String[] args) throws InterruptedException {
// 案例:一條子線程和一條主線程都對(duì)共享變量a進(jìn)行++操作,每條線程對(duì)a++操作400000次
new MyThread().start();
for (int i = 0; i < 200000; i++) {
//MyThread.a++;
MyThread.a.getAndIncrement();
}
// 為了保證子線程和主線程都執(zhí)行完畢
Thread.sleep(3000);
// 打印最終共享變量a的值(子線程,主線程對(duì)a的操作都執(zhí)行完畢了)
System.out.println("最終:"+ MyThread.a.get());
}
}
我們能看到,無(wú)論程序運(yùn)行多少次,其結(jié)果總是正確的!
AtomicInteger類的工作原理-CAS機(jī)制

AtomicIntegerArray類示例
常用的數(shù)組操作的原子類:
1).java.util.concurrent.atomic.AtomicIntegerArray:對(duì)int數(shù)組操作的原子類。 int[]
2).java.util.concurrent.atomic.AtomicLongArray:對(duì)long數(shù)組操作的原子類。long[]
3).java.util.concurrent.atomic.AtomicReferenceArray:對(duì)引用類型數(shù)組操作的原子類。Object[]
數(shù)組的多線程并發(fā)訪問(wèn)的安全性問(wèn)題:
//線程類:
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("結(jié)束");
}
}
//測(cè)試類:
public class Demo {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 1000; i++) {
new MyThread().start();//創(chuàng)建1000個(gè)線程,每個(gè)線程為數(shù)組的每個(gè)元素+1
}
Thread.sleep(1000 * 5);//讓所有線程執(zhí)行完畢
System.out.println("主線程休息5秒醒來(lái)");
for (int i = 0; i < MyThread.arr.length; i++) {
System.out.println(MyThread.arr[i]);
}
}
}
//正常情況,數(shù)組的每個(gè)元素最終結(jié)果應(yīng)為:1000,而實(shí)際打?。?/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ù)組構(gòu)造
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("結(jié)束");
}
}
測(cè)試類
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秒醒來(lái)");
for (int i = 0; i < MyThread.arr.length(); i++) {
System.out.println(MyThread.arr.get(i));
}
}
}
先在能看到,每次運(yùn)行的結(jié)果都是正確的。
到此這篇關(guān)于Java原子類中的AtomicInteger類詳解的文章就介紹到這了,更多相關(guān)Java的AtomicInteger類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Mybatis-Plus中分頁(yè)插件Page中total=0的問(wèn)題
在使用Mybatis-Plus進(jìn)行分頁(yè)查詢時(shí),如果遇到`total=0`的情況,即使查詢到了數(shù)據(jù),也無(wú)法正確分頁(yè),這通常是由于依賴版本問(wèn)題導(dǎo)致的,對(duì)于低版本,需要手動(dòng)配置分頁(yè)攔截器;對(duì)于高版本,可能需要添加特定的依賴配置來(lái)解決這個(gè)問(wèn)題2025-11-11
Spring6當(dāng)中獲取Bean的四種方式小結(jié)
Spring 為Bean 的獲取提供了多種方式,通常包括4種方式,(也就是說(shuō)在Spring中為Bean對(duì)象的創(chuàng)建準(zhǔn)備了多種方案,目的是:更加靈活),本文將通過(guò)代碼示例詳細(xì)的給大家介紹了一下這四種方式,需要的朋友可以參考下2024-04-04
Springboot集成Spring Security實(shí)現(xiàn)JWT認(rèn)證的步驟詳解
這篇文章主要介紹了Springboot集成Spring Security實(shí)現(xiàn)JWT認(rèn)證的步驟詳解,幫助大家更好的理解和使用springboot,感興趣的朋友可以了解下2021-02-02
在idea中g(shù)it實(shí)現(xiàn)里查看歷史代碼方式
這篇文章主要介紹了在idea中g(shù)it里查看歷史代碼的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
SpringBoot使用Scheduling實(shí)現(xiàn)定時(shí)任務(wù)的示例代碼
Spring Boot提供了一種方便的方式來(lái)實(shí)現(xiàn)定時(shí)任務(wù),即使用Spring的@Scheduled注解,通過(guò)在方法上添加@Scheduled注解,我們可以指定方法在何時(shí)執(zhí)行,本文我們就給大家介紹一下SpringBoot如何使用Scheduling實(shí)現(xiàn)定時(shí)任務(wù),需要的朋友可以參考下2023-08-08
Springboot日志開(kāi)啟SLF4J過(guò)程解析
這篇文章主要介紹了Springboot日志開(kāi)啟SLF4J過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Java中l(wèi)ist.contains()的用法及拓展
List集合相信大家在開(kāi)發(fā)過(guò)程中幾乎都會(huì)用到,有時(shí)候難免會(huì)遇到集合里的數(shù)據(jù)是重復(fù)的,需要進(jìn)行去除,下面這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ist.contains()的用法及拓展的相關(guān)資料,需要的朋友可以參考下2023-03-03
Springboot項(xiàng)目快速實(shí)現(xiàn)過(guò)濾器功能
上篇文章已經(jīng)給大家介紹了Springboot項(xiàng)目如何快速實(shí)現(xiàn)Aop功能,這篇文章給大家介紹Springboot項(xiàng)目如何快速實(shí)現(xiàn)過(guò)濾器功能,感興趣的小伙伴可以參考閱讀2023-03-03
macOS完全卸載Java開(kāi)發(fā)環(huán)境詳細(xì)教程
Java開(kāi)發(fā)環(huán)境的搭建是每一位Java程序員職業(yè)生涯的起點(diǎn),其核心在于JDK(Java Development Kit)的正確安裝與系統(tǒng)級(jí)環(huán)境變量的精準(zhǔn)配置,這篇文章主要介紹了macOS完全卸載Java開(kāi)發(fā)環(huán)境的相關(guān)資料,需要的朋友可以參考下2026-01-01

