• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 原子操作類總結

    如果多線程同時更新一個變量,可能造成更新后的值不準確。synchronized會保證多線程不會同時更新一個變量。Jdk1.5增加了java.util.concurrent包,這個包中的原子操作類提供了一種用法簡單、性能高效、線程安全地更新一個變量的方式。
    首先了解下CAS算法
    原子操作類原理是利用CPU的CAS算法,即比較和替換
    public final boolean compareAndSet(int expect,int update)
    該方法調用時,會先檢查當前數值是否等于expect,等于意味著AtomicInteger的值沒有被其他線程修改過,則將AtomicInteger的當前值設置為update的值并返回true,如果不相等,該方法會返回false,不做替換操作。
    Atomic包里提供了13個類,屬于4種類型的原子更新方式:
    1、基本類型,包括AtomicBoolean、AtomicInteger、AtomicLong
    這里寫圖片描述

    public class AtomicIntegerTest {
        private static AtomicInteger num = new AtomicInteger(0);
    
        public static void main(String[] args) {
            for (int i = 0; i < 5; i++) {
                new Thread(()->{
                    System.out.print(num.getAndIncrement());
                }).start();
            }
            System.out.println(num.get());
        }
    }

    輸出結果:

    0
    01234

    2、數組類型,AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray

    public class AtomicIntegerArrayTest {
        static int[] value = new int[]{1, 2};
        static AtomicIntegerArray intArr = new AtomicIntegerArray(value);
    
        public static void main(String[] args) {
            intArr.getAndSet(0, 3);
            System.out.println(intArr.get(0));
            System.out.println(value[0]);
        }
    }

    輸出值:

    3
    1

    從上面的例子看出可以將數組參數傳入相應的原子操作數組類,構造一個原子數組,AtomicIntegerArray會去復制一份數組,對原子操作類的修改不會影響原生數組。
    3、引用類型:AtomicReference、AtomICReferenceFieldUpdater、AtomicMarkableReference
    以下代碼將User對象的引用包裝成原子引用對象類

    static AtomicReference<User> atomicReference = new AtomicReference<>();

    4、原子更新屬性:AtomicIntegerFieldUpdater等

    版權聲明:本文為chang_li原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/chang_li/article/details/79478360

    智能推薦

    一個簡單的socket服務端Demo

    博主本人用的是maven管理的spring-mvc。 核心代碼如下: OioServer.java,socket服務端實體類 OioServerTest.java,socket服務端測試類 Demo項目結構如圖: 啟動服務端: 使用終端敲命令行連接服務端: 終端命令為: 客戶端發消息給服務端,服務端收到消息 終端輸入Ctrl+]可以進入telnet的命令模式,之后輸入quit,之后回車就可以關閉t...

    MAHAKIL之最新類不平衡過采樣方法

           最近在幫實驗室一師兄做實驗時,剛好在學習類不平衡的采樣方法,采樣方法大致分為過采樣和欠采樣兩大類,但是目前研究的主要為過采樣方法,因為它主要是往少數類集合中增加樣本點實現與多數類集合的動態平衡,這樣能最大程度的保證樣本的準確性,所以我將會在接下來的幾篇博客里詳細闡述過采樣方法。過采樣方法一般分為ROS(隨機過采樣),SMOTE-Regular,...

    關于靜態/動態類型檢查 和 不可變包裝的筆記

    靜態類型檢查和動態類型檢查 Java是一種靜態類型語言。所有變量的類型在編譯時(在程序運行之前)都是已知的,因此編譯器也可以推導出所有表達式的類型。如果a和b聲明為int,那么編譯器得出結論,a+b也是int。 相比較之下,在像Python這樣的動態類型語言中,這種檢查會被推遲到run-time。 靜態檢查一個bug比動態檢查好,而動態檢查它比根本不沒檢查它好。 靜態檢查的好處就是可在編譯階段發現...

    IntelliJ IDEA中創建xml文件

    IntelliJ IDEA中創建xml文件 1、file—setting,左上角輸入template, 2、在左側欄找到File And Code Templates 3、中間選中Files 4、點擊+號,添加模板 5、輸入模板名字:Name:mybatis-cfg.xml (name可以自定義) 6、后綴名extension:xml 7、在面板中間輸入內容: 8、把enable li...

    CocosCreator內存與性能優化

    CocosCreator內存與性能優化 一、內存優化 因為 iOS小游戲和微信共用同一個進程,而微信在連續兩次收到系統內存警告的時候會關閉小游戲并釋放小游戲占用的內存。如果你的小游戲有外網用戶反饋“閃退”,或者你自己測試的時候頻繁出現“該小程序可能導致微信響應變慢被終止”等提示,那么就應該是時候優化你的小游戲內存了! 1、優化雙份紋理(必做!) 在你...

    猜你喜歡

    TabLayout+ViewPager實現橫向tab導航欄

    效果 實現方案 activity 布局文件 activity_main.xml view_pager_1.xml view_pager_2.xml 完整源代碼 https://gitee.com/cxyzy1/tablayoutDemo...

    springboot進階

    1.配置文件application.yml 1.1基本語法 k:(空格)v:表示一對鍵值對(空格必須有); 以空格的縮進來控制層級關系;只要是左對齊的一列數據,都是同一個層級的 屬性和值也是大小寫敏感; 1.2值的寫法 1)字面量:普通的值(數字,字符串,布爾) k: v:字面直接來寫; 字符串默認不用加上單引號或者雙引號; “”:雙引號;不會轉義字符串里面的特殊字符;特殊...

    OpenCV學習筆記(二)——初始Mat類

    前言:      在計算機內存中,數字圖像以矩陣的形式存儲和運算,比如,在MatLab中,圖像讀取之后對應一個矩陣,在OpenCV中,同樣也是如此。     在早期的OpenCV1.x版本中,圖像的處理是通過IplImage(該名稱源于Intel的另一個開源庫Intel Image Processing Library ,縮寫成...

    ArrayList實現

    API https://docs.oracle.com/javase/8/docs/api/ 實現 MyList MyArrayList MyIterator MyArrayListIterator Test...

    簡單的定時DDOS攻擊樣本分析

    簡單的定時DDOS攻擊樣本分析 本次分析的樣本來自《惡意軟件分析》課后實驗–Lab-7-01中的程序,將樣本載入到DIE內查殼,如下 程序無殼,使用的VC++6.0編寫,看到編譯時間為2010/09/30 說明這個樣本已經很老很老了。將樣本載入到IDA內分析相關功能,來到入口函數Main出,程序首先調用了StartServiceCtrlDispatcherA啟動了一個名為MalServ...

    精品国产乱码久久久久久蜜桃不卡