1. 程式人生 > >CompareAndSet(CAS)學習筆記

CompareAndSet(CAS)學習筆記

      Compare And Set,直譯過來就是比較並設值,解決多執行緒並行情況下使用鎖造成效能損耗的一種機制,CAS操作包含三個運算元—記憶體位置(V)、預期原值(A)和新值(B)。如果記憶體位置的值與預期原值相匹配,那麼處理器會自動將該位置值更新為新值。否則,處理器不做任何操作。無論哪種情況,它都會在CAS指令之前返回該位置的值。CAS有效地說明了“我認為位置V應該包含值A;如果包含該值,則將B放到這個位置;否則,不要更改該位置,只告訴我這個位置現在的值即可。

下面這個方法是concurrent併發包下atomic.AtomicInteger中實現的CAS方法(jdk8)

翻譯一下注釋:如果當前值等於預期值,原子操作將值設定為給定的更新值。expect為預期值,update為待更新值。

   /**
     * Atomically sets the value to the given updated value
     * if the current value {@code ==} the expected value.
     *
     * @param expect the expected value
     * @param update the new value
     * @return {@code true} if successful. False return indicates that
     * the actual value was not equal to the expected value.
     */
    public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

再深入看看compareAndSwapInt方法是發現是一個native方法,native方法是用其他語言編寫的。

  public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

我們知道 i++,++i都不是原子操作,AtomicInteger中提供了原子操作的i++和++i;都使用了compareAndSwapInt方法。

 //i++
 public final int getAndIncrement() {
        return unsafe.getAndAddInt(this, valueOffset, 1);
 }
public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
}

val1是記憶體中的值,var2是偏移量,var5是預期值,var5+var4是更新值。程式一直迴圈直到預期值與真實值相等並將真實值設定為更新值,並返回原值;Java8版本里的getAndIncrement看著比較難懂,我找了一個低版本的方法。

//i++
public final int getAndIncrement() {
    for (;;) {//一直迴圈直到CAS成功
        int current = get();//獲取當前值(預期值)
        int next = current + 1; //當前值+1(更新值)
        if (compareAndSet(current, next))//如果預期值current與記憶體值相等,設定新值
            return current;//返回新增之前的值
    }
}

低版本方法中引數比較少,更容易理解。CAS在無鎖的情況下實現原子操作,提高了程式的效能,但是在部分情況下回出現ABA問題,在使用時還是需要仔細斟酌。

相關推薦

CompareAndSet(CAS)學習筆記

      Compare And Set,直譯過來就是比較並設值,解決多執行緒並行情況下使用鎖造成效能損耗的一種機制,CAS操作包含三個運算元—記憶體位置(V)、預期原值(A)和新值(B)。如果記憶體位置的值與預期原值相匹配,那麼處理器會自動將該位置值更新為新值。否則,處理

CAS(Compare and Swap)無鎖算法-學習筆記

syn evel 線程安全 上下文切換 原理 oss try 一次 和數 非阻塞同步算法與CAS(Compare and Swap)無鎖算法 這篇問題對java的CAS講的非常透徹! 鎖的代價 1. 內核態的鎖的時候需要操作系統進行一次上下文切換,加鎖、釋放鎖會導致比較多的

CAS SSO學習筆記

CAS的結構:     從結構上看,CAS 包含兩個部分: CAS Server 和 CAS Client。CAS Server 需要獨立部署,主要負責對使用者的認證工作;CAS Client 負責處理對客戶端受保護資源的訪問請求,需

JUC學習筆記之模擬CAS演算法——03

/*  * 模擬 CAS 演算法  */ public class TestCompareAndSwap {     public static void main(String[] args) {     &nbs

(Java學習筆記)CAS機制

文章是學習筆記,如果有誤,請各位指出 環境:JDK8 WIN10 64位 一.什麼是CAS機制 CAS機制的全名叫做compare and swap 讓我們來看一行程式碼 public final native boolean compareAndSwap

CAS JDK 證書錯誤學習筆記

根據目前測試的情況得出以下的分析結論:  1、CAS 證書 分為 HTTP 和HTTPS 兩種訪問方式 (HTTP 模式 不需要JDK 證書直接可以訪問,而HTTPS 模式需要JDK 證書的支援)。  2、如果JDK 中的jre/lib/security 目錄下的金鑰檔案 cacert

Robot Operating System (ROS)學習筆記4---語音控制

sla 語音 出現 tput http 學習 process 輸入 ubun 搭建環境:XMWare Ubuntu14.04 ROS(indigo) 轉載自古月居 轉載連接:http://www.guyuehome.com/260 一、語音識別包 1、安裝

MySQL學習筆記(六)—— MySQL自連接

概念 cor 子查詢 ron 表操作 例子 質量 _id order by 有的時候我們需要對同一表中的數據進行多次檢索,這個時候我們可以使用之前學習過的子查詢,先查詢出需要的數據,再進行一次檢索。 例如:一張products表,有產品id,供應商id(vend_

jquery 深入學習筆記之中的一個 (事件綁定)

color 動態 name his pan mouseover this pre con 【jquery 事件綁定】 1、加入元素事件綁定 (1) 加入事件為當前元素 $(‘p‘).on(‘click‘,function(){ //code here ..

AngularJS入門學習筆記

rect directive 技術分享 attr 兩個 ava 內容 module 大括號 首先聲明: 本博客源自於學習:跟我學AngularJs:AngularJs入門及第一個實例。通過學習,我自己的一些學習筆記。 1.AngularJS的一些基本特性 (1)使用雙大括號

Python學習筆記-2017.5.4

列表 lin 覆蓋範圍 復習 處理 pytho 內部 global txt 本文章記錄學習過程中的細節和心得: 復習所學課程: 1、文件的操作:   打開文件,對文件的操作打開方式有兩種:   第一種:      f = open("test.txt", "r")#以只讀

SAS學習筆記之函數應用

不能 oracle 理解 資料 oracl 函數應用 特殊 put acl 今天在做數據需求的時候遇到一些問題,因為不能夠在數據庫裏面做,僅僅好在SAS裏面實現。這就遇到了一些麻煩,須要使用一些函數實現部分功能,如查找字段中某個特殊字符出現的次數,查找某個字符的位置等,

OpenCV2學習筆記(十五):利用Cmake高速查找OpenCV函數源代碼

one 生成 img log 分享 lan 學習筆記 全部 modules 在使用OpenCV時,在對一個函數的調用不是非常了解的情況下,通常希望查到該函數的官方聲明。而假設想進一步研究OpenCV的函數,則必須深入到源碼。在VS中我們能夠選中想要查

avalonjs 學習筆記1---checkbox

nod item ack lex server ini npm 學習 define 一、vscode 安裝使用 1.vs code+node.js下載安裝 2.在node.js command prompt 中運行 npm install -g live-server 3

Linux學習筆記(三):系統執行級與執行級的切換

查看 用戶操作 回車 water hat ntsysv tde 文件表 config 1.Linux系統與其它的操作系統不同,它設有執行級別。該執行級指定操作系統所處的狀態。Linux系統在不論什麽時候都執行於某個執行級上,且在不同的執行級上執行的程序和服務都不同,所要

Principle of Computing (Python)學習筆記(7) DFS Search + Tic Tac Toe use MiniMax Stratedy

ide out generate depth sku color ati cond with 1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/prin

Java程序猿的JavaScript學習筆記(12——jQuery-擴展選擇器)

type write number article mat 我們 content ace val 計劃按例如以下順序完畢這篇筆記: Java程序猿的JavaScript學習筆記(1——理念) Java程序猿的JavaScript學習筆記(2——屬性復制和繼承) Jav

java學習筆記——String類

通過 ray [] 原理 log spl 2.3 -s 長度 一、概述 ·字符串是一個特殊的對象 ·字符串一旦初始化就不可以被改變 ·String str = "abc"; ·String str1 = new String("abc"); 有什麽區別? package

java學習筆記——java中對象的創建,初始化,引用的解析

初始 學習筆記 style article 學習 base 表達 如果 bsp 如果有一個A類。 1、例如以下表達式: A a1 = new A(); 那麽A是類,a1是引用。new A()是對象。僅僅是a1這個引用指向了new A()這個對象。 2、又如: A

構建之法 學習筆記04

部分 使用 用戶 != 工作 應該 覆蓋率 錯誤處理 必須 關於軟件工程的一些基本概念和技術 單元測試 絕大部分軟件都是由多人合作完成的,大家的工作互相有依賴關系。最典型的的例子就是,某人負責的模板的功能被其他人調用。軟件的額很多錯誤都是來源於程序員對模塊功能的誤解、疏忽或