最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的自旋鎖與阻塞鎖詳解

 更新時間:2023年10月13日 10:37:28   作者:ゞ浪人與酒丶0  
這篇文章主要介紹了Java中的自旋鎖與阻塞鎖詳解,阻塞鎖是指當(dāng)線程嘗試獲取鎖失敗時,線程進入阻塞狀態(tài),直到接收信號后被喚醒,阻塞或者喚醒一個Java線程需要操作系統(tǒng)切換CPU?狀態(tài)來完成,這種狀態(tài)轉(zhuǎn)換?需要耗費處理器時間,需要的朋友可以參考下

自旋鎖

阻塞或者喚醒一個Java線程需要操作系統(tǒng)切換CPU 狀態(tài)來完成,這種狀態(tài)轉(zhuǎn)換 需要耗費處理器時間 如果同步代碼塊到代碼過于簡單,狀態(tài)轉(zhuǎn)換到時間有kennel比用戶執(zhí)行代碼到時間還長 在許多場景下,同步資源到鎖定時間短,為了這小段時間切換線程,線程的掛起和恢復(fù)可能會讓系統(tǒng)得不償失,

這里是為了當(dāng)前線程“ 稍等一下”, 我們需要讓當(dāng)前線程進行自旋 ,如果自旋完成后前面鎖定同步資源的線程以及釋放了鎖,那么當(dāng)前線程就沒必要阻塞,而是直接獲取同步資源,從而避免線程的開銷 阻塞鎖和自旋鎖相反,阻塞鎖如果沒有拿到鎖,就會直接阻塞,知道被喚醒

阻塞鎖

阻塞鎖是指當(dāng)線程嘗試獲取鎖失敗時,線程進入阻塞狀態(tài),直到接收信號后被喚醒.(線程的狀態(tài)包括新建、就緒、運行、阻塞及死亡)在JAVA中,能夠喚醒阻塞線程的操作包括Object.notify, Object.notifyAll, Condition.signal, LockSupport.unpark(JUC中引入)

原理和源碼分析

在 jdk 1.5 及以上并發(fā)框架 Java.util.concurrent 的 atomic 下 都是自旋鎖實現(xiàn)的

AtomicInteger 的實現(xiàn) :自旋鎖實現(xiàn)原理是CAS AtomicInteger 中是調(diào)用底層unsafe 進行自增操作的源碼中的 do-while 循環(huán)就是一個自旋操作,如果修改過程中一踏線程競爭導(dǎo)致修改失敗,就在while 死循環(huán),直至成功

package com.dimple.test;
/**
 * 本實例演示下線程的自旋鎖的實現(xiàn)
 */
public class SpinLockDemo {
    private static AtomicReference<Thread> atomicReference=new AtomicReference<>();
    public void lock(){
        Thread thread=Thread.currentThread();
        while(!atomicReference.compareAndSet(null,thread)){
            System.out.println(thread.getName()+"自旋鎖獲取失敗,重新獲取中");
        }
    }
    public void unlock(){
        Thread thread=Thread.currentThread();
        atomicReference.compareAndSet(thread,null);
    }
    public static void main(String[] args) {
        SpinLockDemo spinLockDemo=new SpinLockDemo();
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName()+"嘗試獲取自旋鎖");
            spinLockDemo.lock();
            System.out.println(Thread.currentThread().getName()+"獲取自旋鎖成功");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            spinLockDemo.unlock();
            System.out.println(Thread.currentThread().getName()+"釋放自旋鎖");
        }).start();
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName()+"嘗試獲取自旋鎖");
            spinLockDemo.lock();
            System.out.println(Thread.currentThread().getName()+"獲取自旋鎖成功");
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            spinLockDemo.unlock();
            System.out.println(Thread.currentThread().getName()+"釋放自旋鎖");
        }).start();
    }
}

Thread-0嘗試獲取自旋鎖
Thread-0獲取自旋鎖成功
Thread-1嘗試獲取自旋鎖
Thread-1自旋鎖獲取失敗,重新獲取中
Thread-1自旋鎖獲取失敗,重新獲取中
Thread-1自旋鎖獲取失敗,重新獲取中
Thread-1自旋鎖獲取失敗,重新獲取中

我們打開 AtomicInteger 源碼看一下,這里是個 do while 循環(huán)

在這里插入圖片描述

自旋鎖的應(yīng)用場景

自旋鎖一般用于多核服務(wù)器,在并發(fā)度不是特別搞的情況下,比阻塞鎖效率高

另外,自旋鎖適用于臨界區(qū)較小的情況,否則如果臨界區(qū)很大,(線程一旦拿到鎖,很多之后才會釋放),那也是不適合的

到此這篇關(guān)于Java中的自旋鎖與阻塞鎖詳解的文章就介紹到這了,更多相關(guān)自旋鎖與阻塞鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于JavaMail API收發(fā)郵件的方法

    基于JavaMail API收發(fā)郵件的方法

    這篇文章主要介紹了基于JavaMail API收發(fā)郵件的方法,實例分析了javamail的使用方法與相關(guān)注意事項,非常具有實用價值,需要的朋友可以參考下
    2015-07-07
  • Spring?Boot?基于?CAS?實現(xiàn)單點登錄的原理、實踐與優(yōu)化全解析(最新整理)

    Spring?Boot?基于?CAS?實現(xiàn)單點登錄的原理、實踐與優(yōu)化全解析(最新整理)

    本文詳解SpringBoot集成CAS單點登錄的原理、實現(xiàn)步驟及優(yōu)缺點,涵蓋CASServer與Client架構(gòu)、票據(jù)機制、配置方法,并提供優(yōu)化策略如集群部署、緩存加速和用戶體驗提升方案,助力企業(yè)實現(xiàn)統(tǒng)一認(rèn)證與高效管理,感興趣的朋友一起看看吧
    2025-07-07
  • Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

    Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

    本篇文章主要介紹了Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼,探討了 PrintWriter 的缺省編碼與普通字符流的缺省編碼的差異,具有一定的參考價值,有興趣的可以了解一下
    2017-11-11
  • Java mybatis常見問題及解決方案

    Java mybatis常見問題及解決方案

    這篇文章主要介紹了Java mybatis常見問題及解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • SpringCloud?Hystrix?斷路器的實現(xiàn)

    SpringCloud?Hystrix?斷路器的實現(xiàn)

    本文主要介紹了SpringCloud?Hystrix?斷路器的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • SpringBoot集成redisson實現(xiàn)延時隊列教程

    SpringBoot集成redisson實現(xiàn)延時隊列教程

    文章介紹了使用Redisson實現(xiàn)延遲隊列的完整步驟,包括依賴導(dǎo)入、Redis配置、工具類封裝、業(yè)務(wù)枚舉定義、執(zhí)行器實現(xiàn)、Bean創(chuàng)建、消費線程啟動及測試接口驗證,適用于需定時處理任務(wù)的場景
    2025-08-08
  • Java 實戰(zhàn)范例之進銷存管理系統(tǒng)的實現(xiàn)

    Java 實戰(zhàn)范例之進銷存管理系統(tǒng)的實現(xiàn)

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+vue+Springboot+ssm+mysql+maven+redis實現(xiàn)一個前后端分離的進銷存管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • Matplotlib可視化之自定義顏色繪制精美統(tǒng)計圖

    Matplotlib可視化之自定義顏色繪制精美統(tǒng)計圖

    matplotlib提供的所有繪圖都帶有默認(rèn)樣式.雖然這可以進行快速繪圖,但有時可能需要自定義繪圖的顏色和樣式,以對繪制更加精美、符合審美要求的圖像.matplotlib的設(shè)計考慮到了此需求靈活性,很容易調(diào)整matplotlib圖形的樣式,需要的朋友可以參考下
    2021-06-06
  • SpringMVC使用注解實現(xiàn)登錄功能

    SpringMVC使用注解實現(xiàn)登錄功能

    這篇文章主要為大家詳細(xì)介紹了SpringMVC使用注解實現(xiàn)登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 聽說用了YYYY-MM-dd的程序員,前些天都在加班改Bug

    聽說用了YYYY-MM-dd的程序員,前些天都在加班改Bug

    這篇文章主要介紹了YYYY-MM-dd的實用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評論

平昌县| 万安县| 措美县| 靖州| 昔阳县| 镇宁| 泰宁县| 监利县| 湖口县| 陆丰市| 岐山县| 元阳县| 佛坪县| 年辖:市辖区| 资兴市| 加查县| 北票市| 鹤壁市| 澜沧| 海原县| 儋州市| 丰都县| 满洲里市| 屏东县| 田阳县| 苍溪县| 多伦县| 桑日县| 德阳市| 莲花县| 珠海市| 潞城市| 德庆县| 阳泉市| 乐山市| 健康| 蓝山县| 安吉县| 唐山市| 鸡东县| 康定县|