日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
一分鐘理解Java公平鎖與非公平鎖

和朋友聊天他提到:ReentrantLock 的構(gòu)造函數(shù)可以傳遞一個(gè) bool 數(shù)據(jù),true 時(shí)構(gòu)造的是“公平鎖”、false 時(shí)構(gòu)造的是“非公平鎖”。

英吉沙網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,英吉沙網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為英吉沙成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的英吉沙做網(wǎng)站的公司定做!

我的印象中鎖是不區(qū)分類(lèi)型的,所以認(rèn)為這應(yīng)該是 Java 發(fā)明的概念,于是就惡補(bǔ)了一下。

鎖的底層實(shí)現(xiàn)

無(wú)論什么語(yǔ)言在操作系統(tǒng)層面鎖的操作都會(huì)變成系統(tǒng)調(diào)用(System Call),以 Linux 為例,就是 futex 函數(shù),可以把它理解為兩個(gè)函數(shù): futex_wait(s),對(duì)變量 s 加鎖;futex_wake(s)釋放 s 上的鎖,喚醒其他線(xiàn)程。

如果你熟悉操作系統(tǒng)原理其實(shí)就是 P/V 操作。

Java 公平鎖和非公平鎖

公平鎖的 lock 操作是調(diào)用futex_wait,unlock 操作是調(diào)用futex_wake。比如下面的代碼

非公平鎖的 lock/unlock 操作會(huì)先做一次 CAS 操作然后再調(diào)用 futex_wait、futex_wake。比如下面的代碼

在上鎖之前增加了一個(gè) CAS 原子操作,它接受三個(gè)變量可以把它理解為下面的邏輯:

***個(gè)參數(shù)的值和第二個(gè)參數(shù)不相等則返回 0 表示操作失敗否則更新為新的值。這個(gè)函數(shù)不是由代碼實(shí)現(xiàn)的而是 CPU 提供的一個(gè)指令,比如 Intel 的叫 cmpxchg;高級(jí)語(yǔ)言進(jìn)行了封裝,比如 Java 的 Atomic 變量。

為什么

明白了原理再來(lái)提問(wèn)為什么,在上鎖之前先通過(guò) CAS 修改一個(gè)變量表示“我要上鎖”了看似很冗余的操作,其實(shí)它是一次自旋,如果資源很快被使用完可以提高系統(tǒng)的吞吐率??紤]下面的場(chǎng)景

上鎖之前的時(shí)間是 t1,上鎖之后是 t2(使用資源),釋放鎖是 t3。

現(xiàn)在有兩個(gè)線(xiàn)程,處于 t1 狀態(tài),其中 A 線(xiàn)程先搶到資源處于 t2 ;B 線(xiàn)程也會(huì)嘗試 lock,與此同時(shí) t2 釋放了,而 lock 動(dòng)作也執(zhí)行成功了 B 被掛起;系統(tǒng)繼續(xù)執(zhí)行 A 釋放成功喚醒 B 繼續(xù)執(zhí)行。

上述過(guò)程中 B 只要再多等待“一丟丟”就不用被掛起,直接獲得資源繼續(xù)執(zhí)行。非公平鎖的 CAS 操作就是為了增加一丟丟時(shí)間。

采用非公平鎖,如果系統(tǒng)中有 3 個(gè)線(xiàn)程執(zhí)行,A 搶到資源,C 沒(méi)有搶到處于掛起狀態(tài),此時(shí) B 嘗試 CAS 操作,而 A 剛好釋放掉資源還沒(méi)有來(lái)得及喚醒 C,那么 B 會(huì)先搶到資源,在 C 之前執(zhí)行。這就是“非公平”的來(lái)歷,雖然 C 老老實(shí)實(shí)的等待了很長(zhǎng)時(shí)間,但是 B 的“時(shí)機(jī)”把握的好,迅速“插隊(duì)”完成資源搶占。

總結(jié)

上鎖的過(guò)程本身也是有時(shí)間開(kāi)銷(xiāo)的,如果操作資源的時(shí)間比上鎖的時(shí)間還短建議使用非公平鎖可以提高系統(tǒng)的吞吐率;否則就老老實(shí)實(shí)的用公平鎖。

【本文是專(zhuān)欄作者“邢森”的原創(chuàng)文章,轉(zhuǎn)載請(qǐng)聯(lián)系作者本人獲取授權(quán)】

戳這里,看該作者更多好文


文章名稱(chēng):一分鐘理解Java公平鎖與非公平鎖
分享URL:http://m.5511xx.com/article/dhdjecd.html