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

Java中的自旋鎖spinlock詳解

 更新時間:2024年01月13日 10:12:46   作者:java架構(gòu)師-太陽  
這篇文章主要介紹了Java中的自旋鎖spinlock詳解,自旋鎖就是循環(huán)嘗試獲取鎖,不會放棄CPU時間片,減傷cup上下文切換,缺點是循環(huán)會消耗cpu,需要的朋友可以參考下

自旋鎖

過程

獲取鎖 訪問共享資源 釋放鎖

自旋鎖

循環(huán)嘗試獲取鎖,不會放棄CPU時間片,減傷cup上下文切換,缺點是循環(huán)會消耗cpu

非自旋鎖

如果獲取不到鎖,讓線程休眠,CPU就可以在這段時間去做很多其他的事情,直到之前持有這把鎖的線程釋放了鎖,于是CPU再把之前的線程恢復(fù)回來,讓這個線程再去嘗試獲取這把鎖。若再次失敗,就再次讓線程休眠,若成功,一樣可以成功獲取到同步資源的鎖

在這里插入圖片描述

如果在獲取自旋鎖時,沒有任何執(zhí)行單元保持該鎖,那么將立即獲取鎖。 如果在獲取鎖時已經(jīng)有持有者,那么鎖操作將自旋,直到自旋鎖的保持者釋放了鎖。

缺點

自旋鎖一直占用著CPU,他在未獲得鎖的情況下,一直運行(自旋),所以占用著CPU,如果不能在很短的時間內(nèi)獲得鎖,這無疑會使CPU效率降低

互斥鎖與自旋鎖區(qū)別

互斥鎖  在未獲得鎖時,cup會進(jìn)行切換,不會一直等待

自旋鎖   在未獲得鎖時,一直占用著CPU,一直運行(自旋)搶占CUP

在多核機(jī)器中,如果鎖住的“事務(wù)”很簡單,占用很少時間,應(yīng)該用自旋鎖,自旋鎖代價比互斥鎖會小很多。

”事務(wù)”很快執(zhí)行完畢,自旋的消耗遠(yuǎn)遠(yuǎn)小于陷入sleep和wake的消耗。如果鎖住“事務(wù)”粒度較大,就應(yīng)該使用互斥鎖,因為如果用自旋鎖,那么在“事務(wù)”執(zhí)行過程中自旋很長時間還不如使得線程sleep

在單核機(jī)器中。自旋鎖沒有任何意義的,自旋鎖只會浪費唯一核心的cpu 時間片,這個時刻沒有任何線程會運行的。

所以單核機(jī)器中,不論鎖住的”事務(wù)”的粒度大小都要使用。

手寫自旋

public class SpinLockDemo {
    AtomicReference<Thread> atomicReference = new AtomicReference<>();
    public void lock() {
        Thread thread = Thread.currentThread();
        System.out.println(Thread.currentThread().getName()+"\t"+"----come in");
        // 因為atomicReference沒有set,所以是null,compareAndSet方法比較如果是null,就修改為當(dāng)前線程,如果不是null,就循環(huán)判斷
        while (!atomicReference.compareAndSet(null, thread)) {
        }
    }
    public void unLock() {
        Thread thread = Thread.currentThread();
        // 如果atomicReference存儲的是當(dāng)前線程,就修改為null
        atomicReference.compareAndSet(thread,null);
        System.out.println(Thread.currentThread().getName()+"\t"+"----task over,unLock...");
    }
    public static void main(String[] args) {
        SpinLockDemo spinLockDemo = new SpinLockDemo();
        new Thread(() -> {
            spinLockDemo.lock();
            // 業(yè)務(wù)邏輯
            try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); }
            spinLockDemo.unLock();
        },"A").start();
        // 暫停500毫秒,線程A先于B啟動
        try { TimeUnit.MILLISECONDS.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); }
        new Thread(() -> {
            spinLockDemo.lock();
            spinLockDemo.unLock();
        },"B").start();
    }
}

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

相關(guān)文章

  • Eclipse使用maven搭建spring mvc圖文教程

    Eclipse使用maven搭建spring mvc圖文教程

    這篇文章主要為大家分享了Eclipse使用maven搭建spring mvc圖文教程,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Java中ArrayList和Vector的區(qū)別

    Java中ArrayList和Vector的區(qū)別

    本文主要介紹了Java中ArrayList和Vector的區(qū)別,包括線程安全性、性能、同步機(jī)制、擴(kuò)容機(jī)制、遍歷方式等,具有一定的參考價值,感興趣的可以了解一下
    2024-11-11
  • SpringBoot在一定時間內(nèi)限制接口請求次數(shù)的實現(xiàn)示例

    SpringBoot在一定時間內(nèi)限制接口請求次數(shù)的實現(xiàn)示例

    在項目中,接口的暴露在外面,很多人就會惡意多次快速請求,本文主要介紹了SpringBoot在一定時間內(nèi)限制接口請求次數(shù)的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2022-03-03
  • Java中大數(shù)據(jù)推薦算法使用場景分析

    Java中大數(shù)據(jù)推薦算法使用場景分析

    在Java中實現(xiàn)大數(shù)據(jù)推薦算法時,通常會使用一些開源的機(jī)器學(xué)習(xí)庫,如Apache Mahout、Weka、DL4J(DeepLearning4j,用于深度學(xué)習(xí))或者Spark MLlib(用于在Spark集群上運行),這篇文章主要介紹了Java中可以用的大數(shù)據(jù)推薦算法,需要的朋友可以參考下
    2024-06-06
  • Spring?IOC容器Bean管理的完全注解開發(fā)放棄配置文件

    Spring?IOC容器Bean管理的完全注解開發(fā)放棄配置文件

    這篇文章主要為大家介紹了Spring?IOC容器的Bean管理完全注解開發(fā)放棄配置文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • spring源碼下載、編譯、debug的詳細(xì)教程

    spring源碼下載、編譯、debug的詳細(xì)教程

    這篇文章主要介紹了spring源碼下載、編譯、debug的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • java 中break如何跳出外部循環(huán)

    java 中break如何跳出外部循環(huán)

    這篇文章主要介紹了java 中break如何跳出外部循環(huán),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java monitor機(jī)制使用方法解析

    Java monitor機(jī)制使用方法解析

    這篇文章主要介紹了Java monitor機(jī)制使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • 利用Java的Struts框架實現(xiàn)電子郵件發(fā)送功能

    利用Java的Struts框架實現(xiàn)電子郵件發(fā)送功能

    這篇文章主要介紹了利用Java的Struts框架實現(xiàn)電子郵件發(fā)送功能,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • 圖解如何在Spring Boot中使用JSP頁面

    圖解如何在Spring Boot中使用JSP頁面

    這篇文章主要介紹了圖解如何在Spring Boot中使用JSP頁面,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07

最新評論