• <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

    智能推薦

    hive 導出數據之一列多行,轉為一行多列

    需求:提取數據 說明:原數據是一列多行,需要轉化為一行多列 待查詢表為:temp_05 待查詢數據為: 待查詢數據如圖: 需要提取的數據表頭如下: 預定日期 昨日價格 前天價格 2018-02-01 2018-02-02 2018-02-03 2018-02-04 可用提數 SQL 數據如圖: 以下為嘗試過程 數據如圖: 數據如圖: 數據如圖: 數據如圖:...

    asp.net做一個簡易的聊天室

    要求: 結果: 關鍵代碼: Default.aspx Default.aspx.cs Default2.aspx Default2.aspx.cs Default3.aspx Default3.aspx.cs Default4.aspx...

    動態SQL和多表關聯-筆記

    《動態SQL與多表關聯》筆記 學習目標 能夠使用動態SQL完成SQL拼接 能夠使用resultMap完成多表查詢 能夠使用一對一查詢 能夠使用一對多查詢 (注:多對多其實就是兩個一個多) 映射文件:為什么要resultMap 目標 定義結果映射 使用結果映射 回顧 在mybatis中有2種配置文件: 核心配置文件,如:sqlMapConfig.xml 實體類映射文件,如:UserMapper.xm...

    【OpenGL C++ UE4】獲取模型頂點及面索引數據,并優化存儲結構供UE4繪制

    目錄 一、功能需求 二、成果 三、環境配置 四、詳細步驟 4.1 Max制作三棱錐并處理 4.2 核心代碼 4.2.1 傳入結構體數據 4.2.2 頂點去重、更新索引 4.2.3 輸出本地CSV文件 4.3 UE4繪制 一、功能需求 想必你肯定會問我一個問題,UE4直接導入模型不好么? 哈哈,前提是在做畢設時,導師提供的只有頂點與面索引數據,沒有模型。 下文詳細介紹了畢設開發中的難點,涉...

    解決Pyinstaller打包numpy和pandas庫文件過大問題

    解決Pyinstaller壓縮numpy和pandas庫文件過大問題 文件包類型和網上的方法 Windows下docker的安裝 在docker下實現打包     今天是2021年的第一天,先祝各位小伙伴現年快樂哈。最近因為做了一個項目,需要打包文件,文件中包含了numpy和pandas庫,結果打包出來幾百行的代碼居然要900m,人都傻了,翻遍了全網找解決方...

    猜你喜歡

    【混沌工程】基于ChaosBlade實現網絡故障模擬

    一、前言 很久之前曾基于linux內核自帶的TC和netem模擬一些公網中遇到的極端情況(延遲、丟包、重復、損壞和亂序等),驗證了我們傳輸程序的健壯性! 具體細節可見這篇老博客: https://blog.csdn.net/u013128262/article/details/84784663 最近在復現kafka生產端一個timeout異常場景時,發現之前方案時因為內核和OS版本問題有些差異而無...

    使用FileZilla連接時超時,無法連接到服務器

    用FileZilla連接服務器時,顯示錯誤: 解決方法: 檢查基本的內容 主機是否寫錯 端口是否自定義,默認21 檢查用戶名和密碼是否錯誤 如果連接的是公司內網 使用ping命令,測試一下是否能收到數據 收不到則需要開啟VPN,再ping,看是否能接收數據(請老鐵們用自己最合適的方法解決) 如果開啟VPN后能接收數據,則可以連接一下服務器,如果不行(怎么可能不行),則跳轉3并依次嘗試 開啟VPN后...

    反匯編:結構體拷貝傳參

    一、結構體拷貝傳參 二、引用和常引用傳參 三、大結構體做形參/數組拷貝...

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