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

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)文章

  • Java生產(chǎn)者消費者的三種實現(xiàn)方式

    Java生產(chǎn)者消費者的三種實現(xiàn)方式

    這篇文章主要介紹了Java生產(chǎn)者消費者的三種實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java轉(zhuǎn)化為exe程序步驟詳解

    java轉(zhuǎn)化為exe程序步驟詳解

    在本篇內(nèi)容里我們給大家分享了關(guān)于java轉(zhuǎn)化為exe程序的具體步驟和相關(guān)知識點,需要的朋友們學(xué)習(xí)下。
    2019-03-03
  • Java中初始化List的5種方法示例

    Java中初始化List的5種方法示例

    這篇文章主要給大家介紹了關(guān)于Java中初始化List的5種方法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Spring超詳細講解AOP面向切面

    Spring超詳細講解AOP面向切面

    面向?qū)ο缶幊淌且环N編程方式,此編程方式的落地需要使用“類”和 “對象”來實現(xiàn),所以,面向?qū)ο缶幊唐鋵嵕褪菍?nbsp;“類”和“對象” 的使用,面向切面編程,簡單的說,就是動態(tài)地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程
    2022-10-10
  • PageHelper在springboot中的使用方式

    PageHelper在springboot中的使用方式

    這篇文章主要介紹了PageHelper在springboot中的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 詳解java_ 集合綜合案例:斗地主

    詳解java_ 集合綜合案例:斗地主

    這篇文章主要介紹了java_ 集合綜合案例:斗地主,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java中的自動裝箱與自動拆箱的實現(xiàn)

    Java中的自動裝箱與自動拆箱的實現(xiàn)

    自動裝箱和自動拆箱使得我們在使用基本數(shù)據(jù)類型時更加方便,同時也提高了代碼的可讀性和健壯性,本文將詳細介紹Java中的自動裝箱和自動拆箱機制,感興趣的可以了解一下
    2023-08-08
  • SpringBoot連接Nacos集群報400問題及完美解決方法

    SpringBoot連接Nacos集群報400問題及完美解決方法

    這篇文章主要介紹了解決SpringBoot連接Nacos集群報400問題?,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Java9新特性Stream流API優(yōu)化與增強

    Java9新特性Stream流API優(yōu)化與增強

    這篇文章主要為大家介紹了Java9新特性Stream流API優(yōu)化與增強的用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步,早日升職加薪
    2022-03-03
  • 一文詳解Spring是怎樣處理循環(huán)依賴的

    一文詳解Spring是怎樣處理循環(huán)依賴的

    循環(huán)依賴簡單理解就是A,B 兩個bean相互依賴,A依賴B,B依賴A,A->B、B->A大概就是這樣,這篇文章主要介紹了Spring是怎樣處理循環(huán)依賴的,文中通過代碼示例給大家介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2024-01-01

最新評論