Java線程-鎖的分類(四)

一旗唁、前言

Java中的鎖有各種特性,比如可重入與不可重入宴倍,公平與非公平等张症,也可以根據(jù)這些特性進(jìn)行分類。

二鸵贬、可重入鎖
  1. 當(dāng)某個(gè)線程請(qǐng)求一個(gè)由其他線程持有的鎖的時(shí)俗他,發(fā)出請(qǐng)求的的線程就會(huì)阻塞。但當(dāng)一個(gè)線程再次請(qǐng)求自己持有的對(duì)象鎖時(shí)阔逼,如果能請(qǐng)求成功兆衅,說明這個(gè)鎖是可重入的。也就是說線程可以重復(fù)的獲得已經(jīng)持有的鎖嗜浮;
  2. 拿synchronized來說羡亩,synchronized的鎖是原子性的,也是可重入的危融,因此一個(gè)線程調(diào)用synchronized方法的同時(shí)在其方法體內(nèi)部調(diào)用該對(duì)象的另一個(gè)synchronized方法將不會(huì)進(jìn)入阻塞狀態(tài)畏铆,也就是說一個(gè)線程得到對(duì)象鎖后再次請(qǐng)求該對(duì)象鎖是允許的,這就是synchronized的可重入性专挪。

看一段代碼:

public class ThreadTest extends SuperClass {
    public synchronized void test(Thread thread) {
        System.out.println(thread.getName());
        super.test();
    }
}
class SuperClass {
    public synchronized void test() {
        System.out.println(Thread.currentThread().getName());
    }
}

??子類重寫了父類的test方法及志,然后調(diào)用父類的方法片排,此時(shí)如果沒有可重入的鎖寨腔,那么這段代碼將會(huì)產(chǎn)生死鎖。因?yàn)閮蓚€(gè)方法都是synchronized方法率寡,因此每個(gè)test方法再執(zhí)行前都會(huì)獲取SuperClass對(duì)象鎖迫卢,然后如果該鎖不是可重入的,那么在調(diào)用super.test方法時(shí)將無法獲得SuperClass對(duì)象上的鎖冶共,因?yàn)檫@個(gè)鎖已經(jīng)被持有乾蛤,從而線程將永遠(yuǎn)停頓下去每界,等待一個(gè)永遠(yuǎn)也無法獲得的鎖。

  1. 可重入鎖的一種實(shí)現(xiàn)方式是為每個(gè)鎖關(guān)聯(lián)一個(gè)計(jì)數(shù)值和一個(gè)所有者線程家卖。當(dāng)計(jì)數(shù)器為0時(shí)眨层,這個(gè)鎖就被認(rèn)為是沒有被任何線程持有,當(dāng)線程請(qǐng)求一個(gè)未被持有的鎖時(shí)上荡,JVM將記下鎖的持有者趴樱,并且將獲取計(jì)數(shù)值置為1,如果同一個(gè)線程再次獲取這個(gè)鎖酪捡,計(jì)數(shù)值遞增叁征,而當(dāng)線程退出同步代碼塊時(shí),計(jì)數(shù)器會(huì)相應(yīng)的遞減逛薇,當(dāng)計(jì)數(shù)器為0時(shí)捺疼,該鎖被釋放。
  2. 可重入鎖永罚,有時(shí)也被稱為遞歸鎖啤呼,也就是說外層代碼獲取該鎖之后,內(nèi)層遞歸函數(shù)仍然可以獲得該鎖呢袱,JAVA中媳友, ReentrantLocksynchronized 都是 可重入鎖;
  3. 可重入鎖的最大作用就是可以避免死鎖产捞;
二醇锚、可中斷鎖
  1. 可中斷鎖,顧名思義就是可以中斷阻塞中的鎖坯临,Java中的synchronized由于不可中斷焊唬,不是可中斷鎖,而Lock則是可中斷鎖看靠。
  2. 通俗的來說赶促,如果某一線程A正在執(zhí)行鎖中的代碼,另一線程B正在等待獲取該鎖挟炬,可能由于等待時(shí)間過長鸥滨,線程B不想等待了,想先處理其他事情谤祖,我們可以讓它中斷自己或者在別的線程中中斷它婿滓,這種就是可中斷鎖。
三粥喜、讀寫鎖

??就是說對(duì)資源的訪問操作分為讀鎖和寫鎖凸主,分開來進(jìn)行。就是因?yàn)橛辛俗x寫鎖额湘,才使得多個(gè)線程之間的讀操作不會(huì)發(fā)生沖突卿吐,對(duì)應(yīng)的接口是ReadWriteLock旁舰,該接口對(duì)應(yīng)的實(shí)現(xiàn)類是ReentrantReadWriteLock,可以通過對(duì)應(yīng)的readLock()方法獲取讀鎖嗡官,通過writeLock()方法獲取寫鎖箭窜,后續(xù)我們會(huì)學(xué)習(xí)到。

四衍腥、公平鎖

??公平鎖是說根據(jù)請(qǐng)求鎖的順序來獲取鎖绽快,比如同時(shí)有多個(gè)線程在等待獲取鎖的時(shí)候,最先請(qǐng)求的線程會(huì)獲取該鎖(也就是等待時(shí)間最長的線程)紧阔,這種就是公平鎖坊罢。非公平鎖就無法保證這點(diǎn)了,但需要注意下:

  1. Java中的synchronized是一種非公平鎖擅耽,無法保證最先請(qǐng)求的線程先獲取到鎖活孩,而ReentrantLock和ReentrantReadWriteLock,默認(rèn)情況下是非公平鎖乖仇,但可以設(shè)置為公平鎖憾儒,后續(xù)我們學(xué)習(xí)到這里的時(shí)候再說。
  2. 對(duì)ReentrantLock來說乃沙,即使是公平鎖起趾,對(duì)于可輪詢的tryLock仍然有可能會(huì)出現(xiàn)“插隊(duì)”的現(xiàn)象,也就是不按線程請(qǐng)求順序的情況警儒。所以說即使是公平鎖训裆,也不一定能確保線程調(diào)度器是公平的。如果線程調(diào)度器選擇忽略一個(gè)線程蜀铲,而該線程恰好是等待時(shí)間最長的那個(gè)边琉,那么就沒有機(jī)會(huì)公平的處理這個(gè)鎖了。
  3. 公平鎖的實(shí)現(xiàn)需要通過一個(gè)隊(duì)列來維護(hù)線程請(qǐng)求的順序性记劝,并且在進(jìn)行等待和喚醒線程時(shí)存在一定的性能開銷变姨,而非公平性則不用考慮這些,所以大多數(shù)情況下厌丑,非公平鎖的性能要高于公平鎖的性能定欧。但當(dāng)持有鎖的實(shí)際相對(duì)較長,或者請(qǐng)求鎖的平均時(shí)間間隔較長的時(shí)候怒竿,這時(shí)候可以使用公平鎖砍鸠。

本文參考自:
海子-Java并發(fā)編程-Lock
《Java并發(fā)編程實(shí)戰(zhàn)》
《Java核心技術(shù)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市愧口,隨后出現(xiàn)的幾起案子睦番,更是在濱河造成了極大的恐慌类茂,老刑警劉巖耍属,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件托嚣,死亡現(xiàn)場離奇詭異,居然都是意外死亡厚骗,警方通過查閱死者的電腦和手機(jī)示启,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來领舰,“玉大人夫嗓,你說我怎么就攤上這事〕寤啵” “怎么了舍咖?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锉桑。 經(jīng)常有香客問我排霉,道長,這世上最難降的妖魔是什么民轴? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任攻柠,我火速辦了婚禮,結(jié)果婚禮上后裸,老公的妹妹穿的比我還像新娘瑰钮。我一直安慰自己,他們只是感情好微驶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布浪谴。 她就那樣靜靜地躺著,像睡著了一般因苹。 火紅的嫁衣襯著肌膚如雪较店。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天容燕,我揣著相機(jī)與錄音梁呈,去河邊找鬼。 笑死蘸秘,一個(gè)胖子當(dāng)著我的面吹牛官卡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播醋虏,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼寻咒,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了颈嚼?” 一聲冷哼從身側(cè)響起毛秘,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后叫挟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艰匙,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年抹恳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了员凝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奋献,死狀恐怖健霹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓶蚂,我是刑警寧澤糖埋,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站窃这,受9級(jí)特大地震影響阶捆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钦听,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一洒试、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧朴上,春花似錦垒棋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衣撬,卻和暖如春乖订,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背具练。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工乍构, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扛点。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓哥遮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陵究。 傳聞我的和親對(duì)象是個(gè)殘疾皇子眠饮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,336評(píng)論 8 265
  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請(qǐng)注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,071評(píng)論 0 14
  • 1.解決信號(hào)量丟失和假喚醒 public class MyWaitNotify3{ MonitorObject m...
    Q羅閱讀 873評(píng)論 0 1
  • 在一個(gè)方法內(nèi)部定義的變量都存儲(chǔ)在棧中铜邮,當(dāng)這個(gè)函數(shù)運(yùn)行結(jié)束后仪召,其對(duì)應(yīng)的棧就會(huì)被回收寨蹋,此時(shí),在其方法體中定義的變量將不...
    Y了個(gè)J閱讀 4,413評(píng)論 1 14
  • 突然間有點(diǎn)心疼自己扔茅,想蹲下來狠狠的抱抱自己已旧!不知道為什么生活過的竟如此凄慘…… 最近又重現(xiàn)讀了一遍海子的詩:從明天...
    016d6912f64e閱讀 162評(píng)論 0 0