Java高頻面試之并發編程-25

hello啊,各位觀眾姥爺們!!!本baby今天又來報道了!哈哈哈哈哈嗝🐶

面試官:CAS都有哪些問題?如何解決?


CAS 的問題及解決方案
CAS(Compare and Swap)是一種高效的無鎖并發機制,但在實際使用中需注意以下問題及其解決方案:


1. ABA 問題

問題描述
  • 場景:線程 1 讀取共享變量值為 A,此時線程 2 將值修改為 B,后又改回 A
  • 后果:線程 1 執行 CAS 時認為值未被修改(仍為 A),操作成功,但實際變量已被其他線程修改過,可能導致邏輯錯誤。
解決方案
  • 版本號機制:為變量附加一個版本號(或時間戳),每次修改遞增版本號,CAS 需同時檢查值和版本號。
  • Java 實現
    AtomicStampedReference<Integer> ref = new AtomicStampedReference<>(100, 0);// 更新時檢查值 + 版本號
    int oldStamp = ref.getStamp();
    int newValue = 200;
    ref.compareAndSet(100, newValue, oldStamp, oldStamp + 1);
    

2. 自旋開銷(CPU 資源浪費)

問題描述
  • 場景:高并發下多個線程頻繁競爭同一變量,CAS 失敗后線程會循環重試(自旋),導致 CPU 資源浪費。
  • 后果:大量線程自旋時,CPU 利用率飆升,系統吞吐量下降。
解決方案
  • 自旋優化策略
    • 限制自旋次數:設定最大自旋次數,超過后改用鎖或阻塞。
    • 退避算法:每次失敗后增加等待時間(如指數退避)。
  • 示例代碼(退避)
    int maxRetries = 10;
    int retries = 0;
    while (!atomicInt.compareAndSet(oldValue, newValue)) {if (retries++ > maxRetries) {// 退化為鎖機制synchronized(lock) { ... }break;}Thread.sleep(1 << retries); // 指數退避
    }
    

3. 只能保證單個變量的原子性

問題描述
  • 場景:需對多個共享變量進行原子更新時,CAS 無法直接實現。
    • 例如:轉賬操作需同時修改“賬戶 A 余額”和“賬戶 B 余額”。
解決方案
  • 合并變量:將多個變量封裝為一個對象,用 AtomicReference 原子更新整個對象。
  • 鎖機制:對復合操作使用鎖(如 synchronizedReentrantLock)。
  • 示例代碼(合并變量)
    class AccountPair {int balanceA;int balanceB;
    }AtomicReference<AccountPair> pairRef = new AtomicReference<>(new AccountPair());// 原子更新
    AccountPair oldPair = pairRef.get();
    AccountPair newPair = new AccountPair(oldPair.balanceA - 100, oldPair.balanceB + 100);
    pairRef.compareAndSet(oldPair, newPair);
    

4. 公平性問題

問題描述
  • 場景:CAS 是非公平的,無法保證等待時間最長的線程優先執行。
  • 后果:高競爭下某些線程可能長期無法獲取資源(饑餓現象)。
解決方案
  • 隊列調度:結合隊列機制(如 AQS 的 CLH 隊列),按 FIFO 順序分配資源。
  • 公平鎖:使用 ReentrantLock 的公平模式,確保先到先得。

5. 硬件平臺限制

問題描述
  • 場景:某些硬件(如舊 CPU 或嵌入式設備)不支持 CAS 指令。
  • 后果:無法直接使用 CAS,需依賴軟件模擬(性能較差)。
解決方案
  • 軟件模擬:通過鎖或操作系統提供的原子 API 實現類似功能。
  • 平臺適配:使用高層并發庫(如 Java 的 java.util.concurrent),屏蔽底層差異。

總結

問題解決方案適用場景
ABA 問題版本號(AtomicStampedReference需嚴格檢查變量歷史狀態
自旋開銷退避算法、限制自旋次數、改用鎖高競爭場景
多變量原子性合并變量或使用鎖復合操作需求
公平性隊列調度或公平鎖需避免線程饑餓
硬件限制軟件模擬或高層并發庫不支持 CAS 的平臺

你想要的技術資料我全都有:https://pan.q刪掉漢子uark.cn/s/aa7f2473c65b

在這里插入圖片描述

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

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

相關文章

從碳基羊駝到硅基LLaMA:開源大模型家族的生物隱喻與技術進化全景

在人工智能的廣袤版圖上&#xff0c;一場從生物學羊駝到數字智能體的奇妙轉變正在上演。Meta推出的LLaMA(Large Language Model Meta AI)系列模型&#xff0c;不僅名字源自美洲駝(llama)&#xff0c;更以其開源特性和強大性能&#xff0c;引領了開源大模型社區的“駝類大爆發”…

可下載舊版app屏蔽更新的app市場

軟件介紹 手機用久了&#xff0c;app越來越臃腫&#xff0c;老手機卡頓成常態。這里給大家推薦個改善老手機使用體驗的方法&#xff0c;還能幫我們卸載不需要的app。 手機現狀 如今的app不斷更新&#xff0c;看似在優化&#xff0c;實則內存占用越來越大&#xff0c;對手機性…

Python_day47

作業&#xff1a;對比不同卷積層熱圖可視化的結果 一、不同卷積層的特征特性 卷積層類型特征類型特征抽象程度對輸入的依賴程度低層卷積層&#xff08;如第 1 - 3 層&#xff09;邊緣、紋理、顏色、簡單形狀等基礎特征低高&#xff0c;直接與輸入像素關聯中層卷積層&#xff08…

比較數據遷移后MySQL數據庫和達夢數據庫中的表

設計一個MySQL數據庫和達夢數據庫的表數據比較的詳細程序流程&#xff0c;兩張表是相同的結構&#xff0c;都有整型主鍵id字段&#xff0c;需要每次從數據庫分批取得2000條數據&#xff0c;用于比較&#xff0c;比較操作的同時可以再取2000條數據&#xff0c;等上一次比較完成之…

GC1808高性能24位立體聲音頻ADC芯片解析

1. 芯片概述 GC1808是一款24位立體聲音頻模數轉換器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采樣率&#xff0c;集成Δ-Σ調制器、數字抗混疊濾波器和高通濾波器&#xff0c;適用于高保真音頻采集場景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…

Linux 文本比較與處理工具:comm、uniq、diff、patch、sort 全解析

在類 UNIX 操作系統&#xff0c;特別是 Linux 系統中&#xff0c;命令行提供了一整套強大的文本處理工具&#xff0c;這些工具對于文件差異對比、內容篩選、文本排序以及源代碼管理尤為重要。今天&#xff0c;我們將結合真實示例&#xff0c;深入介紹并實戰演示 comm、uniq、di…

6月6日day46打卡

通道注意力(SE注意力) 知識點回顧&#xff1a; 不同CNN層的特征圖&#xff1a;不同通道的特征圖什么是注意力&#xff1a;注意力家族&#xff0c;類似于動物園&#xff0c;都是不同的模塊&#xff0c;好不好試了才知道。通道注意力&#xff1a;模型的定義和插入的位置通道注意力…

前端技能包

ES6 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><script>// 變量定義var a1;let b5; // 現在使用let 定義變量// 對象解構let person{&quo…

大數據(1) 大數據概述

一、大數據時代 1.三次信息化浪潮 二、什么是大數據 1.四個特點 4V&#xff1a;數據量&#xff08;Volume&#xff09;大、數據類型&#xff08;Variety&#xff09;繁多、處理速度&#xff08;Velocity&#xff09;快、價值密度&#xff08;Value&#xff09;低 三、大數據…

element-plus 單選組件 el-radio,選不上,又沒報錯,直接復制官網也不行解決方案

在使用 Vue 框架開發項目時&#xff0c;Element UI 是常用的組件庫。最近在開發中遇到了 Element 單選框組件el-radio的雙向綁定問題&#xff0c;直接復制element官網上的的案例下來也是不得&#xff0c;經過調試和探索&#xff0c;終于找到了解決方案&#xff0c;特此記錄分享…

使用 Amazon Q Developer CLI 快速搭建各種場景的 Flink 數據同步管道

在 AI 和大數據時代&#xff0c;企業通常需要構建各種數據同步管道。例如&#xff0c;實時數倉實現從數據庫到數據倉庫或者數據湖的實時復制&#xff0c;為業務部門和決策團隊分析提供數據結果和見解&#xff1b;再比如&#xff0c;NoSQL 游戲玩家數據&#xff0c;需要轉換為 S…

開疆智能Ethernet/IP轉Modbus網關連接質量流量計配置案例

首先設置modbus從站的485參數&#xff0c;確保網關和從站的485參數保持一致。 設置完成后打開網關配置軟件并新建項目 先設置網關在Ethernet一側的IP地址以及數據轉換長度。 設置網關的Modbus參數如波特率9600無校驗8數據位&#xff08;無校驗選8&#xff0c;有校驗選9&#xf…

多智能體MPE環境遇到的若干問題

最近學習MADDPG算法&#xff0c;用MPE環境來測試算法性能。于是便下載了pettingzoo包&#xff0c;運行了simple_tag_v3環境&#xff0c;此環境中有獵人、逃亡者和障礙物。 問題1: MPE中的simple_tag_v3環境&#xff0c;在渲染時看似移動的問題 由于相機視角跟隨導致的視覺錯覺…

[特殊字符] FFmpeg 學習筆記

一、FFmpeg 簡介 FFmpeg 是一個開源跨平臺的視頻和音頻處理工具&#xff0c;支持錄制、轉換、流處理等功能。 官網&#xff1a;https://ffmpeg.org 安裝命令&#xff08;macOS&#xff09;&#xff1a; brew install ffmpeg二、基本命令結構 ffmpeg -i 輸入文件 [參數] 輸出…

leetcode Top100 238. 除自身以外數組的乘積|數組系列

題目鏈接&#xff1a;238. 除自身以外數組的乘積 - 力扣&#xff08;LeetCode&#xff09; 238. 除自身以外數組的乘積|數組系列 給你一個整數數組 nums&#xff0c;返回 數組 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據 …

【Liunx專欄_6】Linux線程概念與控制

目錄 1、線程是什么&#xff1f;通過一個圖來理解……2、Linux進程和線程&#xff1f;2.1、之間的關系和區別2.2、線程的優缺點&#xff1f; 3、線程的創建3.1、POSIX線程庫3.2、創建線程3.3、PS查看運行的線程 4、線程的終止5、線程的等待6、線程分離7、線程封裝 1、線程是什么…

「Java基本語法」標識符、關鍵字與常量

知識點解析 1&#xff0e;標識符&#xff08;Identifiers&#xff09;&#xff1a;用于命名類、方法、變量等。 標識符命名規則&#xff1a; 標識符由字母&#xff08;A-Z&#xff0c;a-z&#xff09;、數字&#xff08;0-9&#xff09;、下劃線“_”或美元符號“$”組成。標…

Nginx Stream 層連接數限流實戰ngx_stream_limit_conn_module

1.為什么需要連接數限流&#xff1f; 數據庫/Redis/MQ 連接耗資源&#xff1a;惡意腳本或誤配可能瞬間占滿連接池&#xff0c;拖垮后端。防御慢速攻擊&#xff1a;層疊式限速&#xff08;連接數&#xff0b;帶寬&#xff09;可阻擋「Slow Loris」之類的 TCP 低速洪水。公平接入…

LLMs之Structured Output:vLLM 結構化輸出指南—從約束生成到自動解析與高效實現

LLMs之Structured Output&#xff1a;vLLM 結構化輸出指南—從約束生成到自動解析與高效實現 導讀&#xff1a;隨著大語言模型&#xff08;LLM&#xff09;在各類任務中的廣泛應用&#xff0c;如何使其輸出具備可控性、結構化與可解析性&#xff0c;成為實際部署中的關鍵問題。…

32 C 語言字符處理函數詳解:isalnum、isalpha、iscntrl、isprint、isgraph、ispunct、isspace

1 isalnum() 函數 1.1 函數原型 #include <ctype.h>int isalnum(int c); 1.2 功能說明 isalnum() 函數用于檢查傳入的整數參數是否為 ASCII 編碼的字母或數字字符&#xff08;A - Z、a - z、0 - 9&#xff0c;對應 ASCII 值 65 - 90、97 - 122、48 - 57&#xff09;。…