CAS理解

CAS(Compare And Swap)
是非阻塞同步的實現原理,它是CPU硬件層面的一種指令;
CAS制定操作包含三個參數

  • 內存值(內存地址)v
  • 預期值E
  • 新增值N

當CAS指令執行時,當且僅當預期值E和內存值V相同時,才更新內存值為N,否則不更新;
上述的處理過程是一個原子操作;
CAS 可以看作是它們合并后的整體一個不可分割的原子操作,并且其原子性是直接在硬件層面得到保障的。

CAS的應用場景
再juc的atomic相關類,AQS,currentHashMap等是線上有廣泛的應用

在并發編程中最容易出現的是線程安全的問題,i++在多線程的時候,就無法得到正確的值;而使用synchronized又不能高性能的解決問題;
actomic包提供了一組原子操作類

  • 基本類型:AtomicInteger,AtomicLong,AtomicBoolean
  • 引用類型:AtomicReferenc、AtomicStampedReference
  • 數組類型:AtomicIntegerArray
  • 原子累加器LongAdder,Striped64

原子更新基本類型
以AtomicInteger為例總結常用的方法

 //以原子的方式將實例中的原值加1,返回的是自增前的舊值;
public final int getAndIncrement() {return unsafe.getAndAddInt(this, valueOffset, 1);}//getAndSet(int newValue):將實例中的值更新為新值,并返回舊值;public final boolean getAndSet(boolean newValue) {boolean prev;do {prev 
= get();} while (!compareAndSet(prev, newValue));return prev;}//incrementAndGet() :以原子的方式將實例中的原值進行加1操作,并返回最終相加后的結果;public final int incrementAndGet() {return unsafe.getAndAddInt(this, valueOffset, 1) + 1;}//addAndGet(int delta) :以原子方式將輸入的數值與實例中原本的值相加,并返回最后的結果;public final int addAndGet(int delta) {return unsafe.getAndAddInt(this, valueOffset, delta) + delta;

通過CAS自增實現,如果CAS失敗,自旋直到成功+1。

LongAdder
是LongAdder引入的初衷——解決高并發環境下AtomicInteger,AtomicLong的自旋瓶頸問題。

設計思路
AtomicLong中有個內部變量value保存著實際long值,所有的操作都是針對該變量進行。也就是說高并發的環境下,value變量其實是一個熱點,也就是N個線程競爭一個熱點。LongAdder的基本思路就是分散熱點,將value值分散到一個數組中,不同線程會命中到數組的不同槽中,各個線程只對自己槽中的那個值進行CAS操作,這樣熱點就被分散了,沖突的概率小很多。如果要獲取真正的long值,只要將各個槽點的變量值累加返回;

LongAdder的內部結構
LongAdder內部有一個base變量,一個Cell[]數組:
base變量:非競態條件下,直接累加到該變量上
Cell[]數組:競態條件下,累加個各個線程自己的槽Cell[i]中

CAS缺陷
CAS 雖然高效地解決了原子操作,但是還是存在一些缺陷的,主要表現在三個方面:

  • 自旋 CAS 長時間不成功,則會給 CPU 帶來非常大的開銷
  • 只能保證一個共享變量原子操作
  • ABA 問題

ABA問題的描述和解決方案
描述 :當有多個線程對一個原子類進行操作的時候,某個線程在短時間內將原子類的值A修改為B,又馬上將其修改為A,此時其他線程不感知,還是會修改成功。

ABA問題的解決方案
數據庫有個鎖稱為樂觀鎖,是一種基于數據版本實現數據同步的機制,每次修改一次數據,版本就會進行累加。
同樣,Java也提供了相應的原子引用類AtomicStampedReference, reference即我們實際存儲的變量,stamp是版本,每次修改可以通過+1保證版本唯一性。這樣就可以保證每次修改后的版本也會往上遞增

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

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

相關文章

【SQL】指定日期的產品價格

目錄 題目 分析 代碼 題目 產品數據表: Products ------------------------ | Column Name | Type | ------------------------ | product_id | int | | new_price | int | | change_date | date | ------------------------ (product_id, chang…

《突破Unity+騰訊云聯機瓶頸:多人游戲同步延遲與數據安全的雙維度優化》

在Unity開發的多人聯機游戲中,騰訊云的云服務器(CVM)、游戲多媒體引擎(GME)與云數據庫(CDB)共同構成了聯機體驗的核心支撐。但隨著玩家并發量提升與游戲玩法復雜度增加,“實時同步延…

BisenetV1/2網絡以及模型推理轉換

BisenetV1/2網絡以及模型推理轉換 文章目錄BisenetV1/2網絡以及模型推理轉換1 BiSenetV11.1 Contex Path1.2 Spatial Path1.3 ARM1.4 FFM1.5 backbone2 模型推理代碼流程分析2.1 加載模型2.2 模型推理① 轉換張量② 輸入尺寸調整③ 模型推理④ 輸出尺寸還原⑤ 類別預測⑥ 保存繪…

Android開發-文本輸入

一、EditText 基礎&#xff1a;不僅僅是輸入框EditText 是 TextView 的子類&#xff0c;允許用戶輸入和編輯文本。1. 基本布局<EditTextandroid:id"id/et_username"android:layout_width"match_parent"android:layout_height"wrap_content"an…

數據化存儲菜單,國際化方案

djangoclass Menu(models.Model):parent_id models.BigIntegerField(default0, verbose_name父菜單ID)name models.CharField(max_length50, verbose_name菜單名稱)icon models.CharField(max_length50, blankTrue, nullTrue, verbose_name菜單圖標)path models.CharField(…

SQL-用戶管理與操作權限

在 SQL 中&#xff0c;用戶管理和權限操作是數據庫安全管理的核心組成部分&#xff0c;用于控制 “誰能訪問數據庫” 以及 “能對數據庫做什么”。它們共同保障數據庫的安全性、完整性和合規性。一、用戶管理&#xff1a;控制 “誰能訪問數據庫”用戶管理是指對數據庫用戶的創建…

計算機視覺案例分享之答題卡識別

目錄 一、基本流程 二、代碼實現 1. 導入工具包和定義常量 2. 輔助函數定義 2.1 坐標點排序函數 2.2 透視變換函數 2.3 輪廓排序函數 2.4 圖像顯示函數 3. 主程序處理流程 3.1 圖像預處理 3.2 輪廓檢測與透視變換 3.3 閾值處理與選項檢測 3.4 答案識別與評分 我們…

Java面試問題記錄(四)

四、設計模式1、設計模式6大原則1&#xff09;單一職責(一個類和方法只做一件事)、2&#xff09;里氏替換(多態&#xff0c;子類可擴展父類)、3&#xff09;依賴倒置(細節依賴抽象&#xff0c;下層依賴上層)、4&#xff09;接口隔離(建立單一接口)、迪米特原則(最少知道&#x…

高等教育學

高等教育學第一章 高等教育與高等教育學第二章 高等教育發展史2-1西方高等教育發展史2-2中國高等教育發展史第三章 高等教育理念3.1-王一軍-高等教育理念的構成要素3.2-王一軍-高等教育理念的主要流派第四章 高等學校教育4.1 高等學校教育制度4.2-陳何芳-高等教育辦學體制 &…

unordered_map使用MFC的CString作為鍵值遇到C2056和C2064錯誤

文章目錄unordered_map使用MFC的CString作為鍵值遇到C2056和C2064錯誤問題出現的背景解決方案總結unordered_map使用MFC的CString作為鍵值遇到C2056和C2064錯誤 問題出現的背景 在我的一個老工程項目中&#xff0c;使用C的std::unordered_map時&#xff0c;使用了MFC的CStrin…

Maven 本地倉庫的 settings.xml 文件

本地倉庫目錄位置&#xff1a;C:/用戶/用戶名/.m2/repository 需要修改配置&#xff0c;具體的修改方法請看 ↓↓↓ 2024版 IDEA 用 Maven 創建 java 項目&#xff08;Maven 安裝和配置&#xff09; <?xml version"1.0" encoding"UTF-8"?><!…

vue動畫內置組件

文章目錄vue動畫的官方類名EnterLeaveTransition組件注意事項觸發實例TransitionGroup組件注意事項觸發機制實例拓展vue動畫的官方類名 如下來自vue官方文檔&#xff0c;提供了dom元素&#xff0c;插入Enter和刪除Leave的類名 Enter v-enter-from&#xff1a;進入動畫的起始…

軟考中級信息安全與病毒防護知識點

### 一、核心知識點梳理這部分內容可以大致分為三個方面&#xff1a;**信息安全基本概念**、**加解密技術** 和 **惡意代碼&#xff08;病毒&#xff09;防護**。#### 1. 信息安全的基本目標&#xff08;CIA三元組&#xff09; 這是所有信息安全問題的基石&#xff0c;必須熟練…

數組存儲 · 行主序與列主序 | 應用 / 基地址 / 選擇策略

注&#xff1a;本文為 “數組存儲 行主序與列主序” 相關合輯。 英文引文&#xff0c;機翻未校。 中文引文&#xff0c;略作重排。 未整理去重&#xff0c;如有內容異常&#xff0c;請看原文。 Row major and Column Major Address calculations 按行主序和按列主序的地址計算…

在 CentOS 中安裝 VirtualBox 增強功能的步驟

很好&#xff0c;你看到 /run/media/asfor/VBox_GAs_7.2.2&#xff0c;這說明你已經在 VirtualBox 中掛載了“增強功能&#xff08;Guest Additions&#xff09;”光盤&#xff0c;接下來只要手動安裝就可以啟用共享剪貼板、全屏分辨率、鼠標無縫移動等功能。&#x1f4dd; 在 …

Python快速入門專業版(三十):函數進階:函數嵌套與作用域(內部函數訪問外部變量)

目錄引一、函數嵌套&#xff1a;在函數內部定義函數1. 基本語法與調用方式示例1&#xff1a;簡單的函數嵌套結構2. 嵌套函數的典型應用&#xff1a;隱藏輔助邏輯示例2&#xff1a;用嵌套函數隱藏輔助邏輯二、嵌套函數的作用域&#xff1a;變量訪問規則1. 內部函數訪問外部函數的…

C++數組與字符串:從基礎到實戰技巧

C中的數組和字符串是處理數據集合和文本的基礎工具。數組用于存儲相同類型的元素集合&#xff0c;而字符串則專門用于處理文本數據。C提供了兩種主要的字符串處理方式&#xff1a;C風格字符串&#xff08;字符數組&#xff09;和C的std::string類。 &#x1f4ca; 1. 數組 (Arr…

艾邁斯歐司朗推出首款高功率多芯片激光器封裝

在投影顯示領域掀起技術革新的浪潮中&#xff0c;艾邁斯歐司朗猶如一位技藝精湛的工匠&#xff0c;精心打造出Vegalas Power系列高功率激光二極管的首顆明珠——PLPM7_455QA激光器。這款采用多顆GaN基功率激光器集成封裝的新品&#xff0c;在短脈沖周期內綻放出42W的璀璨光芒&a…

機器視覺中的工業相機接口該如何選擇?

工業相機接口&#xff1a;數據傳輸的“高速公路”&#xff0c;選對了才夠快 在機器視覺系統里&#xff0c;工業相機就像“眼睛”&#xff0c;而接口則是連接“眼睛”與“大腦”&#xff08;后端處理系統&#xff09;的“高速公路”。這條“路”的寬窄、長短、抗干擾能力&#x…

[數據結構——lesson10.2堆排序以及TopK問題]

目錄 前言 學習目標 堆排序 TopK問題&#xff1a; 解法一&#xff1a;建立N個數的堆 解法二&#xff1a;建立K個數的堆&#xff08;最優解&#xff09; 完整代碼 結束語 前言 上節內容我們詳細講解了堆[數據結構——lesson10.堆及堆的調整算法]&#xff0c;接下來我們…