欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的CAS(Compare-And-Swap)操作示例詳解

 更新時(shí)間:2025年06月06日 11:02:01   作者:二進(jìn)制11  
CAS是一種原子操作,用于在多線程環(huán)境中實(shí)現(xiàn)無鎖(lock-free)的線程安全編程,下面通過本文給大家介紹Java中的CAS(Compare-And-Swap)操作示例詳解,感興趣的朋友一起看看吧

Java面試題 - 什么是Java 的 CAS(Compare-And-Swap)操作?

什么是CAS操作?

CAS(Compare-And-Swap,比較并交換)是一種原子操作,用于在多線程環(huán)境中實(shí)現(xiàn)無鎖(lock-free)的線程安全編程。它是現(xiàn)代并發(fā)編程中的基礎(chǔ)操作之一,Java中的許多并發(fā)工具類(如AtomicInteger、AtomicReference等)都是基于CAS實(shí)現(xiàn)的。

CAS操作包含三個(gè)操作數(shù):

  • 內(nèi)存位置(V)
  • 預(yù)期原值(A)
  • 新值(B)

當(dāng)且僅當(dāng)內(nèi)存位置V的值等于預(yù)期原值A(chǔ)時(shí),處理器才會(huì)將該位置的值更新為新值B,否則不執(zhí)行任何操作。無論哪種情況,都會(huì)返回該位置原來的值。

CAS操作的基本流程

Java中的CAS實(shí)現(xiàn)

在Java中,CAS操作主要通過sun.misc.Unsafe類提供的一系列方法實(shí)現(xiàn),這些方法最終會(huì)調(diào)用本地(native)方法,由JVM借助CPU的CAS指令完成。

Java并發(fā)包(java.util.concurrent.atomic)中的原子類(如AtomicInteger)提供了對(duì)CAS操作的封裝:

public class AtomicInteger extends Number implements java.io.Serializable {
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private volatile int value;
    public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }
    // 其他方法...
}

CAS操作示例

下面是一個(gè)使用AtomicInteger的簡單示例:

import java.util.concurrent.atomic.AtomicInteger;
public class CASExample {
    private static AtomicInteger counter = new AtomicInteger(0);
    public static void main(String[] args) {
        // 初始值為0
        System.out.println("初始值: " + counter.get());
        // 嘗試將0更新為1(會(huì)成功)
        boolean success1 = counter.compareAndSet(0, 1);
        System.out.println("CAS(0,1)結(jié)果: " + success1 + ", 當(dāng)前值: " + counter.get());
        // 嘗試將0更新為2(會(huì)失敗,因?yàn)楫?dāng)前值已經(jīng)是1)
        boolean success2 = counter.compareAndSet(0, 2);
        System.out.println("CAS(0,2)結(jié)果: " + success2 + ", 當(dāng)前值: " + counter.get());
    }
}

輸出結(jié)果:

初始值: 0
CAS(0,1)結(jié)果: true, 當(dāng)前值: 1
CAS(0,2)結(jié)果: false, 當(dāng)前值: 1

CAS的典型應(yīng)用場景

  • 原子類:如AtomicInteger、AtomicLong、AtomicReference等
  • 并發(fā)容器:如ConcurrentHashMap的部分實(shí)現(xiàn)
  • 鎖機(jī)制:如AQS(AbstractQueuedSynchronizer)的實(shí)現(xiàn)基礎(chǔ)
  • 計(jì)數(shù)器:無鎖的線程安全計(jì)數(shù)器

CAS的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 高性能:避免了線程阻塞和上下文切換的開銷
  • 無鎖:減少了死鎖的可能性
  • 可擴(kuò)展性:在高并發(fā)環(huán)境下表現(xiàn)良好

缺點(diǎn)

  • ABA問題:如果一個(gè)值從A變成B,然后又變回A,CAS會(huì)認(rèn)為它沒有變化過
    • 解決方案:使用版本號(hào)或時(shí)間戳(如AtomicStampedReference)

  • 循環(huán)時(shí)間長開銷大:如果CAS失敗,通常會(huì)循環(huán)重試,長時(shí)間不成功會(huì)消耗CPU資源
  • 只能保證一個(gè)共享變量的原子操作:對(duì)于多個(gè)共享變量,需要使用AtomicReference來封裝

CAS與鎖的比較

特性CAS
線程阻塞不會(huì)阻塞(樂觀鎖)會(huì)阻塞(悲觀鎖)
實(shí)現(xiàn)復(fù)雜度較高相對(duì)簡單
適用場景低沖突、簡單操作高沖突、復(fù)雜操作
性能無上下文切換,開銷小有上下文切換,開銷大
公平性不保證公平性可保證公平性

總結(jié)

CAS是Java并發(fā)編程中的重要概念,它提供了一種高效的無鎖線程安全機(jī)制。理解CAS的工作原理對(duì)于編寫高性能并發(fā)程序至關(guān)重要。雖然CAS有ABA問題等局限性,但通過適當(dāng)?shù)慕鉀Q方案(如版本號(hào))可以規(guī)避這些問題。在適當(dāng)?shù)膱鼍跋率褂肅AS,可以顯著提高程序的并發(fā)性能。

到此這篇關(guān)于Java中的CAS(Compare-And-Swap)操作示例詳解的文章就介紹到這了,更多相關(guān)Java CAS操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBean管理與Spring Boot自動(dòng)配置原理解析

    SpringBean管理與Spring Boot自動(dòng)配置原理解析

    在Spring中,Bean的作用域(Scope)決定了Bean的實(shí)例化方式以及其生命周期,下面給大家介紹SpringBean管理與Spring Boot自動(dòng)配置原理解析,感興趣的朋友一起看看吧
    2025-05-05
  • Spring使用aop切面編程時(shí)要給那些類加注解的實(shí)例

    Spring使用aop切面編程時(shí)要給那些類加注解的實(shí)例

    在使用切面編程時(shí),通常需要為以下類或組件添加注解來標(biāo)識(shí)它們,以便 Spring 或其他切面框架能夠正確識(shí)別和處理它們,這篇文章主要介紹了Spring使用aop切面編程時(shí)要給那些類加注解,需要的朋友可以參考下
    2023-11-11
  • java編程實(shí)現(xiàn)屏幕截圖(截屏)代碼總結(jié)

    java編程實(shí)現(xiàn)屏幕截圖(截屏)代碼總結(jié)

    這篇文章主要介紹了java編程實(shí)現(xiàn)屏幕截圖(截屏)代碼,結(jié)合3個(gè)實(shí)例總結(jié)分析了Java截屏?xí)r頁面抓取及圖片保存的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • spring boot結(jié)合Redis實(shí)現(xiàn)工具類的方法示例

    spring boot結(jié)合Redis實(shí)現(xiàn)工具類的方法示例

    這篇文章主要介紹了spring boot結(jié)合Redis實(shí)現(xiàn)工具類的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • Java字母加數(shù)字組合比較大小

    Java字母加數(shù)字組合比較大小

    這篇文章主要通過實(shí)現(xiàn)Comarable接口來比較(如"a20"和"a9"這種)字符串的大小,希望能給大家做一個(gè)參考。
    2016-06-06
  • 詳解Java的內(nèi)置異常以及創(chuàng)建自定義異常子類的方法

    詳解Java的內(nèi)置異常以及創(chuàng)建自定義異常子類的方法

    這篇文章主要介紹了詳解Java的內(nèi)置異常以及創(chuàng)建自定義異常子類的方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • iOS多線程介紹

    iOS多線程介紹

    這篇文章主要介紹了iOS多線程的相關(guān)知識(shí),涉及到對(duì)進(jìn)程,線程等方面的知識(shí)講解,本文非常具有參考價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • MyBatis中insert操作返回主鍵的實(shí)現(xiàn)方法

    MyBatis中insert操作返回主鍵的實(shí)現(xiàn)方法

    在使用MyBatis做持久層時(shí),insert語句默認(rèn)是不返回記錄的主鍵值,而是返回插入的記錄條數(shù)。這篇文章主要介紹了MyBatis中insert操作返回主鍵的方法,需要的朋友可以參考下
    2016-09-09
  • Java-Io-RandomAccessFile任意位置讀寫數(shù)據(jù)的操作小結(jié)

    Java-Io-RandomAccessFile任意位置讀寫數(shù)據(jù)的操作小結(jié)

    RandomAccessFile類支持隨機(jī)訪問方式,可以跳轉(zhuǎn)到文件的任意位置讀寫數(shù)據(jù),這個(gè)類在文件隨機(jī)讀取時(shí)有很大的優(yōu)勢,可利用多線程完成對(duì)一個(gè)大文件的讀寫,本文給大家介紹Java-Io-RandomAccessFile(任意位置讀寫數(shù)據(jù))的相關(guān)知識(shí),需要的朋友可以參考下
    2022-05-05
  • Java利用JSONPath操作JSON數(shù)據(jù)的技術(shù)指南

    Java利用JSONPath操作JSON數(shù)據(jù)的技術(shù)指南

    JSONPath?是一種強(qiáng)大的工具,用于查詢和操作?JSON?數(shù)據(jù),類似于?SQL?的語法,它為處理復(fù)雜的?JSON?數(shù)據(jù)結(jié)構(gòu)提供了簡單且高效的解決方案,本文將介紹?JSONPath?的基本語法,并通過詳細(xì)的?Java?示例展示其實(shí)際應(yīng)用,需要的朋友可以參考下
    2025-04-04

最新評(píng)論