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

???????Java公平鎖和非公平鎖的區(qū)別

 更新時(shí)間:2022年05月10日 16:41:49   作者:??Java中文社群????  
本文介紹???????Java公平鎖和非公平鎖區(qū)別,公平鎖是每個(gè)線(xiàn)程獲取鎖順序是按照線(xiàn)程訪(fǎng)問(wèn)鎖的先后順序獲取的,最前面的線(xiàn)程總是最先獲取到鎖;而非公平鎖是每個(gè)線(xiàn)程獲取鎖的順序是隨機(jī)的,并不會(huì)遵循先來(lái)先得的規(guī)則,所有線(xiàn)程會(huì)競(jìng)爭(zhēng)獲取鎖,下文內(nèi)容需要的朋友可以參考下

前言:

從公平的角度來(lái)說(shuō),Java 中的鎖總共可分為兩類(lèi):公平鎖和非公平鎖。但公平鎖和非公平鎖有哪些區(qū)別?孰優(yōu)孰劣呢?在 Java 中的應(yīng)用場(chǎng)景又有哪些呢?接下來(lái)我們一起來(lái)看。

正文

公平鎖:每個(gè)線(xiàn)程獲取鎖的順序是按照線(xiàn)程訪(fǎng)問(wèn)鎖的先后順序獲取的,最前面的線(xiàn)程總是最先獲取到鎖。
非公平鎖:每個(gè)線(xiàn)程獲取鎖的順序是隨機(jī)的,并不會(huì)遵循先來(lái)先得的規(guī)則,所有線(xiàn)程會(huì)競(jìng)爭(zhēng)獲取鎖。

 舉個(gè)例子:公平鎖就像開(kāi)車(chē)經(jīng)過(guò)收費(fèi)站一樣,所有的車(chē)都會(huì)排隊(duì)等待通過(guò),先來(lái)的車(chē)先通過(guò),

如下圖所示:

通過(guò)收費(fèi)站的順序也是先來(lái)先到,分別是張三、李四、王五,這種情況就是公平鎖。 而非公平鎖相當(dāng)于,來(lái)了一個(gè)強(qiáng)行加塞的老司機(jī),它不會(huì)準(zhǔn)守排隊(duì)規(guī)則,來(lái)了之后就會(huì)試圖強(qiáng)行加塞,如果加塞成功就順利通過(guò),當(dāng)然也有可能加塞失敗,如果失敗就乖乖去后面排隊(duì),這種情況就是非公平鎖。 

應(yīng)用場(chǎng)景

在 Java 語(yǔ)言中,鎖 synchronized 和 ReentrantLock 默認(rèn)都是非公平鎖,當(dāng)然我們?cè)趧?chuàng)建 ReentrantLock 時(shí),可以手動(dòng)指定其為公平鎖,但 synchronized 只能為非公平鎖。

 ReentrantLock 默認(rèn)為非公平鎖可以在它的源碼實(shí)現(xiàn)中得到驗(yàn)證,如下源碼所示: 

 當(dāng)使用 new ReentrantLock(true) 時(shí),可以創(chuàng)建公平鎖,如下源碼所示: 

公平和非公平鎖代碼演示

接下來(lái)我們使用 ReentrantLock 來(lái)演示一下公平鎖和非公平鎖的執(zhí)行差異,首先定義一個(gè)公平鎖,開(kāi)啟 3 個(gè)線(xiàn)程,每個(gè)線(xiàn)程執(zhí)行兩次加鎖和釋放鎖并打印線(xiàn)程名的操作,

如下代碼所示:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockFairTest {
    static Lock lock = new ReentrantLock(true);
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                for (int j = 0; j < 2; j++) {
                    lock.lock();
                    System.out.println("當(dāng)前線(xiàn)程:" + Thread.currentThread()
                            .getName());
                    lock.unlock();
                }
            }).start();
        }
    }
}

以上程序的執(zhí)行結(jié)果如下圖所示: 

 接下來(lái)我們使用非公平鎖來(lái)執(zhí)行上面的代碼,具體實(shí)現(xiàn)如下:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockFairTest {
    static Lock lock = new ReentrantLock();
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                for (int j = 0; j < 2; j++) {
                    lock.lock();
                    System.out.println("當(dāng)前線(xiàn)程:" + Thread.currentThread()
                            .getName());
                    lock.unlock();
                }
            }).start();
        }
    }
}

以上程序的執(zhí)行結(jié)果如下圖所示: 

從上述結(jié)果可以看出,使用公平鎖線(xiàn)程獲取鎖的順序是:A -> B -> C -> A -> B -> C,也就是按順序獲取鎖。而非公平鎖,獲取鎖的順序是 A -> A -> B -> B -> C -> C,原因是所有線(xiàn)程都爭(zhēng)搶鎖時(shí),因?yàn)楫?dāng)前執(zhí)行線(xiàn)程處于活躍狀態(tài),其他線(xiàn)程屬于等待狀態(tài)(還需要被喚醒),所以當(dāng)前線(xiàn)程總是會(huì)先獲取到鎖,所以最終獲取鎖的順序是:A -> A -> B -> B -> C -> C。

執(zhí)行流程分析

公平鎖執(zhí)行流程

獲取鎖時(shí),先將線(xiàn)程自己添加到等待隊(duì)列的隊(duì)尾并休眠,當(dāng)某線(xiàn)程用完鎖之后,會(huì)去喚醒等待隊(duì)列中隊(duì)首的線(xiàn)程嘗試去獲取鎖,鎖的使用順序也就是隊(duì)列中的先后順序,在整個(gè)過(guò)程中,線(xiàn)程會(huì)從運(yùn)行狀態(tài)切換到休眠狀態(tài),再?gòu)男菝郀顟B(tài)恢復(fù)成運(yùn)行狀態(tài),但線(xiàn)程每次休眠和恢復(fù)都需要從用戶(hù)態(tài)轉(zhuǎn)換成內(nèi)核態(tài),而這個(gè)狀態(tài)的轉(zhuǎn)換是比較慢的,所以公平鎖的執(zhí)行速度會(huì)比較慢。

非公平鎖執(zhí)行流程

當(dāng)線(xiàn)程獲取鎖時(shí),會(huì)先通過(guò) CAS 嘗試獲取鎖,如果獲取成功就直接擁有鎖,如果獲取鎖失敗才會(huì)進(jìn)入等待隊(duì)列,等待下次嘗試獲取鎖。這樣做的好處是,獲取鎖不用遵循先到先得的規(guī)則,從而避免了線(xiàn)程休眠和恢復(fù)的操作,這樣就加速了程序的執(zhí)行效率。

公平鎖和非公平鎖的性能測(cè)試結(jié)果如下:

 從上述結(jié)果可以看出,使用非公平鎖的吞吐率(單位時(shí)間內(nèi)成功獲取鎖的平均速率)要比公平鎖高很多。

優(yōu)缺點(diǎn)分析

公平鎖的優(yōu)點(diǎn)是按序平均分配鎖資源,不會(huì)出現(xiàn)線(xiàn)程餓死的情況,它的缺點(diǎn)是按序喚醒線(xiàn)程的開(kāi)銷(xiāo)大,執(zhí)行性能不高。 非公平鎖的優(yōu)點(diǎn)是執(zhí)行效率高,誰(shuí)先獲取到鎖,鎖就屬于誰(shuí),不會(huì)“按資排輩”以及順序喚醒,但缺點(diǎn)是資源分配隨機(jī)性強(qiáng),可能會(huì)出現(xiàn)線(xiàn)程餓死的情況。

總結(jié)

在 Java 語(yǔ)言中,鎖的默認(rèn)實(shí)現(xiàn)都是非公平鎖,原因是非公平鎖的效率更高,使用 ReentrantLock 可以手動(dòng)指定其為公平鎖。非公平鎖注重的是性能,而公平鎖注重的是鎖資源的平均分配,所以我們要選擇合適的場(chǎng)景來(lái)應(yīng)用二者。

到此這篇關(guān)于Java公平鎖和非公平鎖的區(qū)別的文章就介紹到這了,更多相關(guān)Java 鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot結(jié)合maven實(shí)現(xiàn)多模塊打包

    springboot結(jié)合maven實(shí)現(xiàn)多模塊打包

    本文主要介紹了springboot借助maven完成多模塊打包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)過(guò)程

    Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)過(guò)程

    以前做導(dǎo)出功能,表頭和數(shù)據(jù)都是固定的,下面這篇文章主要給大家介紹了關(guān)于Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Spring?Boot中的微信支付全過(guò)程(小程序)

    Spring?Boot中的微信支付全過(guò)程(小程序)

    微信支付是企業(yè)級(jí)項(xiàng)目中經(jīng)常使用到的功能,作為后端開(kāi)發(fā)人員,完整地掌握該技術(shù)是十分有必要的。今天通過(guò)本文給大家介紹Spring?Boot中的微信支付全過(guò)程,感興趣的朋友一起看看吧
    2022-05-05
  • 解決@Autowired注入static接口的問(wèn)題

    解決@Autowired注入static接口的問(wèn)題

    這篇文章主要介紹了解決@Autowired注入static接口的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • springmvc fastjson 反序列化時(shí)間格式化方法(推薦)

    springmvc fastjson 反序列化時(shí)間格式化方法(推薦)

    下面小編就為大家?guī)?lái)一篇springmvc fastjson 反序列化時(shí)間格式化方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • 詳解Java編寫(xiě)算法時(shí)如何加快讀寫(xiě)數(shù)據(jù)速度

    詳解Java編寫(xiě)算法時(shí)如何加快讀寫(xiě)數(shù)據(jù)速度

    這篇文章主要為大家詳細(xì)介紹了Java在編寫(xiě)算法時(shí)如何加快讀寫(xiě)數(shù)據(jù)速度,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Java使用數(shù)組實(shí)現(xiàn)ArrayList的動(dòng)態(tài)擴(kuò)容的方法

    Java使用數(shù)組實(shí)現(xiàn)ArrayList的動(dòng)態(tài)擴(kuò)容的方法

    這篇文章主要介紹了Java使用數(shù)組實(shí)現(xiàn)ArrayList的動(dòng)態(tài)擴(kuò)容的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java實(shí)現(xiàn)最小生成樹(shù)算法詳解

    Java實(shí)現(xiàn)最小生成樹(shù)算法詳解

    這篇文章主要介紹了如何在Java中實(shí)現(xiàn)最小生成樹(shù)算法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下
    2022-04-04
  • Spring Cache相關(guān)知識(shí)總結(jié)

    Spring Cache相關(guān)知識(shí)總結(jié)

    今天帶大家學(xué)習(xí)Spring的相關(guān)知識(shí),文中對(duì)Spring Cache作了非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)Java Spring的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Spring中Bean的生命周期及實(shí)例化操作詳解

    Spring中Bean的生命周期及實(shí)例化操作詳解

    這篇文章主要介紹了Spring中Bean的生命周期及實(shí)例化操作詳解,spring的核心思想之一IOC就是通過(guò)IOC容器對(duì)Bean的創(chuàng)建和各個(gè)bean之間的依賴(lài)關(guān)系進(jìn)行操作,今天就來(lái)和大家分享一下bean的生命周期相關(guān)知識(shí)點(diǎn),需要的朋友可以參考下
    2023-08-08

最新評(píng)論

馆陶县| 万盛区| 灵石县| 禹州市| 荔波县| 高尔夫| 上杭县| 金山区| 邹城市| 平陆县| 吉木萨尔县| 南木林县| 广灵县| 柏乡县| 洛川县| 西吉县| 布尔津县| 关岭| 乐都县| 绿春县| 会泽县| 临澧县| 木兰县| 西盟| 长沙市| 鸡西市| 曲沃县| 钦州市| 牙克石市| 阿勒泰市| 鹤峰县| 苍梧县| 海淀区| 茶陵县| 南郑县| 万荣县| 上饶市| 哈密市| 长葛市| 璧山县| 金秀|