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

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

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

自旋鎖

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

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

阻塞鎖

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

原理和源碼分析

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

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

package com.dimple.test;
/**
 * 本實(shí)例演示下線程的自旋鎖的實(shí)現(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 源碼看一下,這里是個(gè) do while 循環(huán)

在這里插入圖片描述

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

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

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

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

相關(guān)文章

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

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

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

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

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

    Java servlet 使用 PrintWriter 時(shí)的編碼與亂碼的示例代碼

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

    Java mybatis常見問題及解決方案

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

吉安市| 安塞县| 汽车| 桦甸市| 无锡市| 宜黄县| 临湘市| 灵宝市| 云霄县| 阿城市| 福贡县| 青州市| 喀喇沁旗| 衡水市| 泸西县| 来凤县| 山阴县| 方城县| 呼伦贝尔市| 牙克石市| 松原市| 博兴县| 城步| 佛坪县| 抚松县| 陇川县| 呼伦贝尔市| 台山市| 准格尔旗| 东海县| 普格县| 定安县| 柳江县| 乃东县| 乐昌市| 滕州市| 敖汉旗| 汝城县| 敦化市| 民乐县| 临朐县|