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

淺談Java非阻塞同步機(jī)制和CAS

 更新時(shí)間:2021年06月01日 12:59:08   作者:flydean  
我們知道在java 5之前同步是通過Synchronized關(guān)鍵字來實(shí)現(xiàn)的,在java 5之后,java.util.concurrent包里面添加了很多性能更加強(qiáng)大的同步類。這些強(qiáng)大的類中很多都實(shí)現(xiàn)了非阻塞的同步機(jī)制從而幫助其提升性能。

什么是非阻塞同步

非阻塞同步的意思是多個(gè)線程在競爭相同的數(shù)據(jù)時(shí)候不會(huì)發(fā)生阻塞,從而能夠在更加細(xì)粒度的維度上進(jìn)行協(xié)調(diào),從而極大的減少線程調(diào)度的開銷,從而提升效率。非阻塞算法不存在鎖的機(jī)制也就不存在死鎖的問題。

在基于鎖的算法中,如果一個(gè)線程持有了鎖,那么其他的線程將無法進(jìn)行下去。使用鎖雖然可以保證對資源的一致性訪問,但是在掛起和恢復(fù)線程的執(zhí)行過程中存在非常大的開銷,如果鎖上面存在著大量的競爭,那么有可能調(diào)度開銷比實(shí)際工作開銷還要高。

悲觀鎖和樂觀鎖

我們知道獨(dú)占鎖是一個(gè)悲觀鎖,悲觀鎖的意思就是假設(shè)最壞的情況,如果你不鎖定該資源,那么就有其他的線程會(huì)修改該資源。悲觀鎖雖然可以保證任務(wù)的順利執(zhí)行,但是效率不高。

樂觀鎖就是假設(shè)其他的線程不會(huì)更改要處理的資源,但是我們在更新資源的時(shí)候需要判斷該資源是否被別的線程所更改。如果被更改那么更新失敗,我們可以重試,如果沒有被更改,那么更新成功。

使用樂觀鎖的前提是假設(shè)大多數(shù)時(shí)間系統(tǒng)對資源的更新是不會(huì)產(chǎn)生沖突的。

樂觀鎖的原子性比較和更新操作,一般都是由底層的硬件支持的。

CAS

大多數(shù)的處理器都實(shí)現(xiàn)了一個(gè)CAS指令(compare and swap),通常來說一個(gè)CAS接收三個(gè)參數(shù),數(shù)據(jù)的現(xiàn)值V,進(jìn)行比較的值A(chǔ),準(zhǔn)備寫入的值B。只有當(dāng)V和A相等的時(shí)候,才會(huì)寫入B。無論是否寫入成功,都會(huì)返回V。翻譯過來就是“我認(rèn)為V現(xiàn)在的值是A,如果是那么將V的值更新為B,否則不修改V的值,并告訴我現(xiàn)在V的值是多少。”

這就是CAS的含義,JDK中的并發(fā)類是通過使用Unsafe類來使用CAS的,我們可以自己構(gòu)建一個(gè)并發(fā)類,如下所示:

public class CasCounter {

    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;
    private volatile int value;

    static {
        try {
            valueOffset = unsafe.objectFieldOffset
                    (CasCounter.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }

    public CasCounter(int initialValue) {
        value = initialValue;
    }

    public CasCounter() {
    }

    public final int get() {
        return value;
    }

    public final void set(int newValue) {
        value = newValue;
    }

    public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

}

上面的例子中,我們定義了一個(gè)原子操作compareAndSet, 它內(nèi)部調(diào)用了unsafe的compareAndSwapInt方法。

看起來上面的CAS使用比直接使用鎖復(fù)雜,但實(shí)際上在JVM中實(shí)現(xiàn)鎖定時(shí)需要遍歷JVM中一條非常復(fù)雜的代碼路徑,并可能導(dǎo)致操作系統(tǒng)級(jí)的鎖定,線程掛機(jī)和上下文切換等操作。在最好的情況下,鎖定需要執(zhí)行一次CAS命令。

CAS的主要缺點(diǎn)就是需要調(diào)用者自己來處理競爭問題(重試,回退,放棄),而在鎖中可以自動(dòng)處理這些問題。

前面的文章我們也講到了原子變量,原子變量的底層就是使用CAS。

以上就是淺談Java非阻塞同步機(jī)制和CAS的詳細(xì)內(nèi)容,更多關(guān)于Java非阻塞同步機(jī)制和CAS的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 如何解決java.net.BindException:地址已在使用問題

    如何解決java.net.BindException:地址已在使用問題

    當(dāng)Zookeeper啟動(dòng)報(bào)錯(cuò)“java.net.BindException:地址已在使用”時(shí),通常是因?yàn)橹付ǖ亩丝谝驯黄渌M(jìn)程占用,解決這個(gè)問題需要按照以下步驟操作:首先,使用命令如lsof -i:2181找到占用該端口的進(jìn)程號(hào);其次,使用kill命令終止該進(jìn)程
    2024-09-09
  • SpringBoot中使用Redis對接口進(jìn)行限流的實(shí)現(xiàn)

    SpringBoot中使用Redis對接口進(jìn)行限流的實(shí)現(xiàn)

    本文將結(jié)合實(shí)例代碼,介紹SpringBoot中使用Redis對接口進(jìn)行限流的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Spring Aop 源碼增強(qiáng)獲取分享

    Spring Aop 源碼增強(qiáng)獲取分享

    這篇文章主要介紹了Spring Aop 源碼增強(qiáng)獲取分享,文章圍繞主題的內(nèi)容展開Spring Aop的相關(guān)介紹,具有一定的參考價(jià)值需要的小伙伴可以參考一下
    2022-05-05
  • SpringBoot ThreadLocal 簡單介紹及使用詳解

    SpringBoot ThreadLocal 簡單介紹及使用詳解

    ThreadLocal 叫做線程變量,意思是 ThreadLocal 中填充的變量屬于當(dāng)前線程,該變量對其他線程而言是隔離的,也就是說該變量是當(dāng)前線程獨(dú)有的變量,這篇文章主要介紹了SpringBoot ThreadLocal 的詳解,需要的朋友可以參考下
    2024-01-01
  • Java中Queue的poll()和remove()區(qū)別詳解

    Java中Queue的poll()和remove()區(qū)別詳解

    這篇文章主要介紹了Java中Queue的poll()和remove()區(qū)別詳解,Queue接口提供了許多方法,其中poll()和remove()是兩個(gè)常用的方法,它們的區(qū)別在于,當(dāng)隊(duì)列為空時(shí),poll()方法返回null,而remove()方法會(huì)拋出,需要的朋友可以參考下
    2023-07-07
  • HashMap和List遍歷方法及如何遍歷刪除元素總結(jié)

    HashMap和List遍歷方法及如何遍歷刪除元素總結(jié)

    在本篇文章中小編給大家分享了關(guān)于HashMap和List遍歷方法及如何遍歷刪除元素知識(shí)點(diǎn)總結(jié),需要的朋友們參考下。
    2019-05-05
  • Spring Boot使用Spring的異步線程池的實(shí)現(xiàn)

    Spring Boot使用Spring的異步線程池的實(shí)現(xiàn)

    這篇文章主要介紹了Spring Boot使用Spring的異步線程池的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • IntelliJ IDEA的數(shù)據(jù)庫管理工具實(shí)在太方便了(推薦)

    IntelliJ IDEA的數(shù)據(jù)庫管理工具實(shí)在太方便了(推薦)

    這篇文章主要介紹了IntelliJ IDEA的數(shù)據(jù)庫管理工具實(shí)在太方便了,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Mybatis中的config.xml配置文件詳細(xì)解析

    Mybatis中的config.xml配置文件詳細(xì)解析

    這篇文章主要介紹了詳解Mybatis-config.xml配置文件,需要的朋友可以參考下
    2017-12-12
  • Java 線程池原理深入分析

    Java 線程池原理深入分析

    這篇文章主要介紹了Java 線程池原理深入分析的相關(guān)資料,需要的朋友可以參考下
    2017-02-02

最新評(píng)論