Java面試八股之Java中有哪些原子類,原理是什么

  1. Java中有哪些原子類,原理是什么

AtomicInteger?和?AtomicLong:

用于對整數(int)和長整數(long)進行原子操作。

原理:它們內部封裝了一個整型或長整型變量,并通過使用Unsafe類提供的CAS(Compare-and-Swap)操作來實現原子更新。CAS是一種無鎖的同步機制,它在更新值時會檢查預期值是否與當前值相等,如果相等則更新為新值,否則不進行任何改變。這種操作是原子的,即不會被其他線程中斷,確保了多線程環境下更新的原子性和可見性。同時,這些類還使用了volatile關鍵字來確保變量的內存可見性,即當一個線程修改了該變量的值時,其他線程能夠立即看到最新值。

AtomicBoolean:

用于對布爾值進行原子操作。

原理:類似于AtomicInteger和AtomicLong,AtomicBoolean內部封裝了一個布爾值,并同樣使用CAS操作來實現原子的set、getAndSet、compareAndSet等操作。volatile關鍵字同樣用于確保布爾值的可見性。

AtomicReference:

用于對引用類型進行原子操作。

原理:它封裝了一個對象引用,并通過CAS操作來原子地更新引用指向的對象。compareAndSet方法會比較當前引用與預期引用是否一致,一致則替換為新的引用,否則不作更改。同樣,volatile關鍵字確保了對象引用的可見性。

AtomicIntegerArray?和?AtomicLongArray:

分別用于對整型數組和長整型數組進行原子操作。

原理:這兩個類提供了對數組元素的原子更新操作,如getAndAdd、compareAndSet等。它們同樣基于CAS機制,在更新數組元素時確保原子性,同時使用volatile數組元素來保證多線程環境下的可見性。

AtomicStampedReference:

帶有標記(stamp)的引用類型原子操作類。

原理:除了維護一個引用外,還附加了一個整數標記。在進行原子更新時,不僅比較引用本身,還會比較標記值。這種設計可以解決ABA問題(即一個值被多次改變后又變回原始值,但期間發生了其他變化,僅通過比較值本身無法察覺)。compareAndSet方法會同時檢查引用和標記是否符合預期,只有兩者都滿足條件才會更新。

AtomicIntegerFieldUpdater?和?AtomicLongFieldUpdater,以及?AtomicReferenceFieldUpdater:

這些類允許對指定類的某個非靜態整型、長整型或引用類型字段進行原子更新。

原理:它們使用反射機制獲取并操作指定對象的字段,同樣基于CAS來實現原子更新。由于需要反射,使用時需提供目標類、字段名和訪問權限修飾符。這些類適用于無法直接修改源代碼以使用原子類的情況,但使用較為繁瑣,且可能存在性能損失。

注:CAS是一種基于硬件級別的無鎖同步算法,它通過原子性地比較和交換內存中的值來實現線程安全的更新操作。在Java中,CAS主要通過Unsafe類提供的方法實現,并被廣泛應用在java.util.concurrent.atomic包下的原子類中。雖然CAS帶來了高性能和無阻塞的優點,但也存在ABA問題、潛在的自旋開銷以及對復雜同步場景支持不足等挑戰。

??如果大家需要視頻版本的講解,歡迎關注我的B站:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12865.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12865.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12865.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HarmonyOS - 記一次HSP異常堆棧無法定位問題

問題背景 HSP混淆打包之后無法定位異常堆棧,問題堆棧為: MyModules/build/default/cache/default/defaultCompileArkTS/esmodule/release/MyModules/src/main/ets/d/r.ts:1:1 問題原因: 導致無法定位問題的原因是,混淆時開啟了代碼…

OpenHarmony 實戰開發——ArkUI容器類API介紹

容器類,顧名思義就是存儲的類,用于存儲各種數據類型的元素,并具備一系列處理數據元素的方法。在 ArkUI 開發框架中,容器類采用了類似靜態的語言來實現,并通過 NAPI 框架對外提供。通過對存儲位置以及屬性的限制&#x…

關于數據結構B+TREE 和 HASH的整理

一、BTREE BTree是一種樹數據結構,是B-Tree的變種,屬于n叉排序樹,每個節點通常有多個孩子。 BTree是和B-Tree相比,BTree的所有的數據都會出現在葉子節點上,并且葉子節點會形成一個單向鏈表,非葉子節點僅僅…

C++map容器關聯式容器

Cmap 1. 關聯式容器 vector、list、deque、forward_list(C11)等STL容器,其底層為線性序列的數據結構,里面存儲的是元素本身,這樣的容器被統稱為序列式容器。而map、set是一種關聯式容器,關聯式容器也是用來存儲數據的&#xff0…

日期問題,

日期問題 ac代碼 #include <cstdio> #include <iostream>using namespace std;int days[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};bool check_valid(int year, int month, int day) {if (month 0 || month > 12) return false;if (day 0) …

【開發】模型部署筆記

目錄 模型量化 模型量化 1、模型量化優點 低精度模型表示模型權重數值格式為FP16&#xff08;半精度浮點&#xff09;或者INT8&#xff08;8位定點整數&#xff09;&#xff0c;但是目前低精度往往就指代INT8。常規精度模型則一般表示模型權重數值格式為FP32&#xff08;32位…

求數組最大值

#include <bits/stdc.h> using namespace std; int main(){int a[4]{1,2,3,4};cout<<*max_element(a,a4);return 0; }

策略模式詳解

策略模式 1 概述 先看下面的圖片&#xff0c;我們去旅游選擇出行模式有很多種&#xff0c;可以騎自行車、可以坐汽車、可以坐火車、可以坐飛機。 作為一個程序猿&#xff0c;開發需要選擇一款開發工具&#xff0c;當然可以進行代碼開發的工具有很多&#xff0c;可以選擇Idea進…

JavaScript的跳轉傳參方式

在JavaScript中&#xff0c;頁面跳轉并傳遞參數通常可以通過幾種不同的方式來實現。下面是一些常見的方法&#xff1a; 1.URL參數&#xff08;Query String&#xff09; 這是最常見的方式&#xff0c;通過在URL的末尾添加參數來實現。例如&#xff1a; javascriptwindow.loc…

gitlab webhook觸發jenkins任務

配置jenkins 安裝gitlab插件 配置jenkins job 選擇gitlab webhook觸發 在高級中生成token 代碼倉設置 新增webhook 配置webhook 測試連接 缺點&#xff0c;不能帶gitLab事件的參數&#xff01;&#xff01;&#xff01;

Spark RDD案例:統計網站每月訪問量

這個項目利用Spark技術&#xff0c;通過統計網站訪問記錄中的日期信息&#xff0c;實現了對每月訪問量的統計和排序。通過分析數據&#xff0c;我們可以了解到不同月份的網站訪問情況&#xff0c;為進一步優化網站內容和推廣策略提供數據支持。 使用Spark統計網站每月訪問量 …

Apache2.4和PHP8的量子糾纏

Apache不建議你用&#xff0c;PHP建議使用

一種基于電場連續性的高壓MOSFET緊湊模型,用于精確表征電容特性

來源&#xff1a;A Compact Model of High-Voltage MOSFET Based on Electric Field Continuity for Accurate Characterization of Capacitance&#xff08;TED 24年&#xff09; 摘要 本文提出了一種新的高壓MOSFET&#xff08;HV MOS&#xff09;緊湊模型&#xff0c;以消…

P5732 楊輝三角

題目描述 給出 &#x1d45b;(&#x1d45b;≤20)n(n≤20)&#xff0c;輸出楊輝三角的前 &#x1d45b;n 行。 如果你不知道什么是楊輝三角&#xff0c;可以觀察樣例找找規律。 輸入格式 無 輸出格式 無 輸入輸出樣例 輸入 #1復制 6 輸出 #1復制 1 1 1 1 2 1 1 3 3 …

408學習筆記-數據結構-2-線性表

線性表 1、邏輯結構 1、數據結構只有一種邏輯結構&#xff0c;而可以有兩種存儲結構&#xff0c;有多種抽象運算。 2、線性表是一種邏輯結構&#xff0c;屬于總線性結構——線性結構的一種&#xff0c;同屬于線性結構的邏輯結構還有&#xff1a;棧、隊列和數組。 3、線性表定…

【經典文獻】水下光學和聲學成像:融合的時代?最新技術概述

文獻名稱&#xff1a;《Underwater Optical and Acoustic Imaging: A Time for Fusion? A Brief Overview of the State-of-the-Art》作者列表&#xff1a;Fausto Ferreira, Diogo Machado, Gabriele Ferri, Samantha Dugelay and John Potter作者單位&#xff1a;北約科學技術…

【hana】hana1.0多容器常用命令

基礎命令 數據庫 連接數據庫 hdbsql -u system -p {passwd} -i 02 -d {dbname}查詢所有數據庫 SELECT DATABASE_NAME, ACTIVE_STATUS FROM M_DATABASES;停止數據庫&#xff0c;會修改數據庫狀態為No ALTER SYSTEM STOP DATABASE testdb; 啟動數據庫&#xff0c;會修改數據…

多線程的代碼案例

目錄 單例模式 餓漢模式 懶漢模式 阻塞隊列 生產者消費者模型意義: 阻塞隊列使用方法 實現阻塞隊列 阻塞隊列實現生產者消費者模型 定時器 實現簡單的定時器 工廠模式 線程池 為啥呢? 從池子里面取 比 創建線程 效率更高 線程池的創建 怎么填坑 ThreadPoolExec…

多年后,再探算法和數據結構

多年來&#xff0c;通過深入學習和實踐各種編程語言&#xff0c;我對數據結構和算法在程序設計中的中心地位有了新的認識。本次從匯編語言到高級編程語言的探討&#xff0c;展示了無論技術如何進步&#xff0c;構成程序的核心—算法和數據結構—始終保持其基礎和不變的角色。 …