CAS操作

CAS

全稱:Compare and swap,能夠比較和交換某個寄存器中的值和內存中的值,看是否相等,如果相等,則把另外一個寄存器中的值和內存進行交換.

(這是一個偽代碼,所以這里的&address實際上是想要表示取出address中的值)

那么我們可以看到,CAS就是這樣一個簡單的交換操作,那么我們為什么要在這里單獨提出來呢?

原因是:這一段邏輯是通過一條CPU指令來完成的!(這就意味著,它是原子的)

這個對于編寫線程安全的代碼是非常重要的.我們為什么會有線程安全問題?歸根結底是因為當前操作不是原子的.基于CAS又可以衍生出一套"無鎖編程",但是CAS的使用范圍具有一定的局限性.加鎖的適用范圍更廣.

CAS的應用

實現原子類

比如,多線程針對一個count變量進行++操作,在Java標準庫中,已經提供了一組原子類

//原子類的使用
public class Demo {public static AtomicInteger count =new AtomicInteger();public static void main(String[] args) throws InterruptedException {Thread t1=new Thread(()->{for (int i=0;i<5000;i++){// count++;//注意,這里是一個對象,而不是一個變量,所以不能直接使用++;count.getAndIncrement();//相當于:count++;//count.incrementAndGet();//相當于:++count;//count.getAndDecrement();//相當于count--;//count.decrementAndGet();//相當于--count;}});Thread t2=new Thread(()->{for (int i = 0; i < 5000; i++) {count.getAndIncrement();}});t1.start();t2.start();t1.join();t2.join();System.out.println(count.get());}
}

對于這個關鍵字,現在這個關鍵字說的已經不算了,到底要不要將這個數據放到寄存器當中,是由編譯器來自主決定的.

為什么這兩個CAS訪問內存會有先后呢?多個CPU在操作同一個資源,也會涉及到鎖競爭(指令級別的鎖),指令級別的鎖是比synchronized代碼級別的鎖要輕量很多的.

實現自旋鎖

CAS的ABA問題

CAS的關鍵要點是比較寄存器1和內存的值,通過這里的值是否相等來判定內存的值是否發生了變化,如果內存的值變了,那么就存在其他線程對其進行了修改,如果內存的值沒有變,那么就說明沒有其他線程進行修改,接下來進行的修改就是安全的.

如果這里的值沒有變,就一定沒有別的線程進行修改嗎?

A-B-A

另一個線程,把變量的值從A->B,又從B->A.此時本線程就區分不了,這個值是始終沒變還是出現變化有變回來了的這種情況.大部分情況下,就算出現ABA問題也沒事.

在面對ABA問題,CAS的基本思路是正確的,但是主要是修改操作能夠進行反復橫跳,就容易讓咱們CAS的判定失效.CAS判定的是"值相同",實際上期望的是"值沒有變化過"如果約定,值只能單向變化,那不就可以判斷了嗎?有的時候我們的數據不允許只增加不減少,此時我們只需要在增加一個變量來專門記錄修改的次數就可以了.

CAS也是屬于多線程開發中的一種典型的思路,在實際開發中,一般不會直接使用CAS,都是用庫里已經基于CAS封裝好的組件(就像原子類這種)

native

見到native關鍵字,就要明白這個方法是在JVM內部通過C++代碼實現的了

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

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

相關文章

基于SpringBoot房屋租賃管理系統設計和實現(源碼+LW+調試文檔+講解等)

&#x1f497;博主介紹&#xff1a;?全網粉絲10W,CSDN作者、博客專家、全棧領域優質創作者&#xff0c;博客之星、平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰?&#x1f497; Java精品實戰案例《1000套》 2025-2026年最值得選擇的Java畢業設計選題大全&#xff…

TVBox自定義配置+軟件密碼版本

apk地址 : https://gitee.com/wheat-wheat/kekeda-duck-apk 1、安裝安卓SDK Android SDK Windows 安裝及環境配置教程_sdk manager windows-CSDN博客 修改點: 基礎配置: java版本:

在系統已經存在postgres時,安裝gitlab

以下作廢&#xff0c;感覺直接裝gitlab太不穩定了&#xff0c;現在轉而使用dockers安裝gitlab https://cloud.tencent.com/developer/article/2309562 https://www.cnblogs.com/lvzhenjiang/p/14949722.html https://cloud.tencent.com/developer/article/2256871 https://blo…

新火種AI|國產大模型展開決戰,是資本游戲還是技術革命?

作者&#xff1a;一號 編輯&#xff1a;美美 資本角逐與技術革新&#xff0c;國產大模型的雙線戰場已然開啟。 隨著人工智能技術的不斷進步&#xff0c;國產大模型正迅速成為行業關注的焦點。在這個由數據驅動的時代&#xff0c;資本的注入和技術創新的加速&#xff0c;讓國…

Spring Cloud中的服務路由與過濾技術實現

Spring Cloud中的服務路由與過濾技術實現 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在微服務架構中&#xff0c;服務路由與過濾是確保服務之間通信有效性和安全性的重要技術。Spring Cloud作為…

Python28-6 隨機森林

隨機森林算法詳細介紹 1. 理論背景 隨機森林&#xff08;Random Forest&#xff09;是一種由Leo Breiman和Adele Cutler在2001年提出的集成學習方法。它結合了多個決策樹的預測結果&#xff0c;以提高模型的準確性和魯棒性。 2. 算法細節 隨機森林的構建過程可以分為以下幾…

Qt——升級系列(Level Eight):界面優化

目錄 QSS 背景介紹 基本語法 QSS設置方式 指定控件樣式設置 全局樣式設置 從文件加載樣式表 使用Qt Designer 編輯樣式 選擇器 選擇器概況 子控件選擇器 偽類選擇器 樣式屬性 盒模型 控件樣式示例 按鈕 復選框、單選框 輸入框 列表 菜單欄 登錄界面 繪圖 基本概念 繪制各種形…

[Go 微服務] Kratos 使用的簡單總結

文章目錄 1.Kratos 簡介2.傳輸協議3.日志4.錯誤處理5.配置管理6.wire 1.Kratos 簡介 Kratos并不綁定于特定的基礎設施&#xff0c;不限定于某種注冊中心&#xff0c;或數據庫ORM等&#xff0c;所以您可以十分輕松地將任意庫集成進項目里&#xff0c;與Kratos共同運作。 API -&…

Linux內網端口轉公網端口映射

由于服務商做安全演練&#xff0c;把原先服務器內網的端口映射到外網端口全都關閉了&#xff0c;每次維護服務器特別麻煩&#xff0c;像數據庫查詢如果用原生的mysql 去連接&#xff0c;查詢返回的結果亂了&#xff0c;非常不方便。 查了服務還是可以正常訪問部分外網的&#x…

知識圖譜查詢語言的表示

文章目錄 SPARQL知識圖譜查詢基本構成常見的SPARQL查詢算子語義Markup表示語言SPARQL知識圖譜查詢基本構成 RDF 支持類似數據庫的查詢語言,叫作SPARQL,它提供了查詢RDF 數據的標準語法、處理SPARQL查詢的規則以及結果返回形式。 變量,RDF中的資源,以“?”或者“$”指示;…

【chatgpt】pytorch的全連接層FC

文章目錄 創建全連接層全連接層&#xff08;線性層&#xff09;使用 PyTorch 定義全連接層1. 定義一個全連接層2. 查看層的參數3. 使用全連接層 示例&#xff1a;構建一個簡單的神經網絡總結 打印FC參數輸出解釋完整代碼示例示例輸出總結 線性層的參數和屬性線性層的參數和屬性…

抖音外賣服務商入駐流程及費用分別是什么?入駐官方平臺的難度大嗎?

隨著抖音關于新增《【到家外賣】內容服務商開放準入公告》的意見征集通知&#xff08;以下簡稱“通知”&#xff09;的發布&#xff0c;抖音外賣服務商入駐流程及費用逐漸成為眾多創業者所關注和熱議的話題。不過&#xff0c;就當前的討論情況來看&#xff0c;這個話題似乎沒有…

軟件測試中安全測試包含內容及安全測試怎么測

一、軟件測試安全測試包含哪些 1. 漏洞掃描 漏洞掃描是軟件測試安全測試的基礎&#xff0c;它用于檢測應用程序和系統中存在的已知漏洞。安全測試工具如AppScan、OWASP ZAP和Nessus等可以對應用程序進行自動化掃描&#xff0c;發現可能存在的漏洞&#xff0c;如跨站點腳本&am…

7.2、指針變量的定義和使用

代碼 #include <iostream> using namespace std; #include <string>int main() {//定義指針int a 10;//指針定義語法&#xff1a;數據類型 * 指針變量名int * p;//讓指針記錄變量a的地址p &a;cout << "a的地址為&#xff1a;" << &am…

MySQL之應用層優化(二)

應用層優化 Web服務器問題 尋找最優并發度 每個Web服務器都有一個最佳并發度——就是說&#xff0c;讓進程處理請求盡可能快&#xff0c;并且不超過系統負載的最優的并發連接數。這就是前面說的最大系統容量。進行一個簡單的測量和建模&#xff0c;或者只是反復試驗&#xf…

2024年湖南省各市科小申報時間(科技型中小企業申報流程、條件、好處)新政

湖南省各市科小申報時間流程 一、評價管理 省科技廳牽頭負責科技型中小企業評價工作的組織和監督、實地核查、公示公告、入庫登記及編號撤銷和集中抽查工作&#xff0c;及時處理相關異議、投訴和舉報信息。 各市州科技局負責科技型中小企業評價工作的具體實施&#xff0c;組…

nginx SSI(Server Side Include)服務端包含 合并拼裝靜態內容

一、什么是SSI 在被傳送給瀏覽器之前&#xff0c;服務器會對 HTML 文檔進行完全地讀取、分析以及修改&#xff0c;使用SSI指令將文本、圖片或代碼信息包含到網頁中。對于整個頁面可以拆分成多個模塊&#xff0c;通過SSI指令將幾個模塊拼接成一個完整的頁面&#xff0c;當有內容…

【數據庫原理】課程筆記

數據庫原理 一、數據庫系統基礎 數據模型的類型 概念數據模型&#xff1a; 概念數據模型也稱概念模型或信息模型,是對現實世界中問題域內事務(特性)的描述,是以用戶觀點實現世界的模型(圖形表示)。主要用于描述事物的概念化結構,使數據庫的設計人員在設計初期,避開計算機系統及…

ATA-L2水聲功率放大器驅動水聲換能器的測試研究

隨著水聲通信技術的發展&#xff0c;水下通信設備也開始逐步走向實用化&#xff0c;為了滿足其實際的使用要求&#xff0c;功率放大器的設計需要具有高效率的特性&#xff0c;并能在水下長時間連續可靠的工作。 壓電陶瓷換能器主要負責電信號與聲信號之間的轉換&#xff0c;換能…

mybatis配置返回boolean類型

先大概說明一下ResultMap和ResultType的使用場景 ResultMap適用于復雜的查詢&#xff0c;可以處理多表關聯查詢、嵌套查詢等情況。通過ResultMap&#xff0c;可以更精確地控制查詢結果的映射。ResultType適用于簡單的查詢&#xff0c;而ResultMap適用于復雜的查詢。具體使用哪…