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()); } }
我們能看到,無論程序運行多少次,其結(jié)果總是正確的!
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("結(jié)束"); } }
//測試類:
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ù)組的每個元素最終結(jié)果應(yīng)為: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ù)組構(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é)束"); } }
測試類
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)); } } }
先在能看到,每次運行的結(jié)果都是正確的。
到此這篇關(guān)于Java原子類中的AtomicInteger類詳解的文章就介紹到這了,更多相關(guān)Java的AtomicInteger類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java一個接口多個實現(xiàn)類的調(diào)用方式
這篇文章主要給大家介紹了關(guān)于java一個接口多個實現(xiàn)類的調(diào)用方式的相關(guān)資料,經(jīng)測試確認,當一個接口有多個實現(xiàn)時,調(diào)用時只會執(zhí)行一個,有時候需要多個實現(xiàn)調(diào)用,需要的朋友可以參考下2023-09-09數(shù)據(jù)結(jié)構(gòu)與算法之手撕排序算法
排序算法看似簡單,其實不同的算法中蘊涵著經(jīng)典的算法策略。通過熟練掌握排序算法,就可以掌握基本的算法設(shè)計思想,本文主要介紹了Java中的排序算法,需要的朋友歡迎閱讀2023-04-04java教程散列表和樹所對應(yīng)容器類及HashMap解決沖突學習
本篇篇文章是java教程,主要介紹了java教程散列表,樹所對應(yīng)容器類及HashMap解決沖突的學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10Java8 實現(xiàn)stream將對象集合list中抽取屬性集合轉(zhuǎn)化為map或list
這篇文章主要介紹了Java8 實現(xiàn)stream將對象集合list中抽取屬性集合轉(zhuǎn)化為map或list的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02Spring?Boot中優(yōu)雅地處理參數(shù)傳遞的技巧分享
最近一直在學習Spring Boot,今天將其中的從前臺過來的參數(shù)傳遞總結(jié)一下,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot中優(yōu)雅地處理參數(shù)傳遞的技巧,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-05-05springboot3.2整合mybatis-plus詳細代碼示例
這篇文章主要給大家介紹了關(guān)于springboot3.2整合mybatis-plus的相關(guān)資料,Spring Boot是一個非常流行的Java Web框架,可以快速地搭建Web應(yīng)用程序,需要的朋友可以參考下2023-12-12Java結(jié)構(gòu)型設(shè)計模式之橋接模式詳細講解
橋接,顧名思義,就是用來連接兩個部分,使得兩個部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實現(xiàn)部分分離解耦,使他們可以獨立的變化。本文通過示例詳細介紹了橋接模式的原理與使用,需要的可以參考一下2022-09-09SpringBoot項目嵌入RocketMQ的實現(xiàn)示例
本文主要介紹了SpringBoot項目嵌入RocketMQ的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-05-05Java中HashSet和HashMap的區(qū)別_動力節(jié)點Java學院整理
這篇文章主要介紹了Java中HashSet和HashMap的區(qū)別_動力節(jié)點Java學院整理,需要的朋友可以參考下2017-04-04Spring Boot中優(yōu)雅的獲取yml文件工具類
今天小編就為大家分享一篇關(guān)于Spring Boot中優(yōu)雅的獲取yml文件工具類,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12