死磕java同步系列之開篇-創(chuàng)新互聯(lián)

簡(jiǎn)介

同步系列,這是彤哥想了好久的名字,本來是準(zhǔn)備寫鎖相關(guān)的內(nèi)容,但是java中的CountDownLatch、Semaphore、CyclicBarrier這些類又不屬于鎖,它們和鎖又有很多共同點(diǎn),都是為了協(xié)同多線程的執(zhí)行,都是一種同步器,所以這里就借用同步來取名字了,也就是“同步系列”的來源。

專業(yè)從事成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè),高端網(wǎng)站制作設(shè)計(jì),小程序開發(fā),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊(duì)竭力真誠(chéng)服務(wù),采用HTML5建站+CSS3前端渲染技術(shù),響應(yīng)式網(wǎng)站,讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項(xiàng)小組,與您實(shí)時(shí)在線互動(dòng),隨時(shí)提供解決方案,暢聊想法和感受。

概覽

這一篇的內(nèi)容會(huì)比較多,大致包含三大主題:java中的鎖、同步器、分布式鎖,大致講的內(nèi)容如下:

(1)volatile

(2)synchronized

(3)AQS及Condition

(4)ReentrantLock

(5)ReentrantReadWriteLock

(6)StampedLock

(7)CountDownLatch

(8)Semaphore

(9)CyclicBarrier

(10)Phaser

(11)Mysql實(shí)現(xiàn)分布式鎖

(12)Redis實(shí)現(xiàn)分布式鎖

(13)Zookeeper實(shí)現(xiàn)分布鎖

這些內(nèi)容都比較晦澀難懂,網(wǎng)上也有比較多的資料,但往往講得不夠透徹,彤哥會(huì)盡量用通俗易懂的語言把這些問題講清楚。

名詞解釋

關(guān)于鎖的名詞也有很多,彤哥大致整理了下,全部列到這里:

(1)公平鎖/非公平鎖

公平鎖,是指按照線程申請(qǐng)的順序獲取鎖。

非公平鎖,是指不是按照線程申請(qǐng)的順序獲取鎖,有可能后申請(qǐng)的線程反而先獲取到鎖,假如先來的線程一直獲取不到鎖,會(huì)造成鎖饑餓現(xiàn)象。

ReentrantLock中可以通過構(gòu)造方法指定是否為公平鎖,默認(rèn)為非公平鎖,非公平鎖的優(yōu)點(diǎn)在于吞吐量大。

synchronized無法指定為公平鎖,一直都是非公平鎖。

(2)可重入鎖

可重入鎖,是指一個(gè)線程獲取鎖之后再嘗試獲取鎖時(shí)會(huì)自動(dòng)獲取鎖,可重入鎖的優(yōu)點(diǎn)是避免死鎖。

ReentrantLock和synchronized都是可重入鎖。

(3)獨(dú)享鎖/共享鎖

獨(dú)享鎖,是指鎖一次只能被一個(gè)線程持有。

共享鎖,是指鎖一次可以被多個(gè)線程持有。

ReentrantLock和synchronized都是獨(dú)享鎖,ReadWriteLock的讀鎖是共享鎖,寫鎖是獨(dú)享鎖。

(4)互斥鎖/讀寫鎖

與獨(dú)享鎖/共享鎖的概念差不多,是獨(dú)享鎖/共享鎖的具體實(shí)現(xiàn)。

ReentrantLock和synchronized都是互斥鎖

ReadWriteLock是讀寫鎖

(5)樂觀鎖/悲觀鎖

悲觀鎖,是指認(rèn)為對(duì)于同一個(gè)數(shù)據(jù)的并發(fā)操作必然會(huì)發(fā)生修改,即使不會(huì)發(fā)生修改也這么認(rèn)為,所以一定要加鎖。

樂觀鎖,是指認(rèn)為對(duì)于同一個(gè)數(shù)據(jù)的并發(fā)操作不一定會(huì)發(fā)生修改,在更新數(shù)據(jù)的時(shí)候,嘗試去更新數(shù)據(jù),如果失敗就不斷嘗試。

悲觀鎖適用于寫操作多的場(chǎng)景,樂觀鎖適用于讀操作多的場(chǎng)景。

(6)分段鎖

分段鎖,是一種鎖的設(shè)計(jì)思路,它細(xì)化了鎖的粒度,主要運(yùn)用在ConcurrentHashMap中,實(shí)現(xiàn)高效的并發(fā)操作,當(dāng)操作不需要更新整個(gè)數(shù)組時(shí),就只鎖數(shù)組中的一項(xiàng)就可以了。

(7)偏向鎖/輕量級(jí)鎖/重量級(jí)鎖

這三個(gè)鎖主要是針對(duì)synchronized進(jìn)行優(yōu)化使用的,主要是通過對(duì)象監(jiān)視器在對(duì)象頭中的字段來表明的。

偏向鎖,是指一段同步代碼一直被一個(gè)線程訪問,那么這個(gè)線程會(huì)自動(dòng)獲取鎖,降低獲取鎖的代價(jià)。

輕量級(jí)鎖,是指當(dāng)鎖是偏向鎖時(shí),被另一個(gè)線程所訪問,偏向鎖會(huì)升級(jí)為輕量級(jí)鎖,這個(gè)線程會(huì)通過自旋的方式嘗試獲取鎖,不會(huì)阻塞,提高性能。

重量級(jí)鎖,是指當(dāng)鎖是輕量級(jí)鎖時(shí),當(dāng)自旋的線程自旋了一定的次數(shù)后,還沒有獲取到鎖,就會(huì)進(jìn)入阻塞狀態(tài),該鎖升級(jí)為重量級(jí)鎖,重量級(jí)鎖會(huì)使其他線程阻塞,性能降低。

(8)自旋鎖

自旋鎖,是指嘗試獲取鎖的線程不會(huì)阻塞,而是循環(huán)的方式不斷嘗試,這樣的好處是減少線程的上下文切換帶來的開鎖,提高性能,缺點(diǎn)是循環(huán)會(huì)消耗CPU。

(9)監(jiān)視器鎖

synchronized的實(shí)現(xiàn)方式,使用monitorenter和monitorexit來實(shí)現(xiàn)。

(10)mutex鎖

互斥鎖,LockSupport.part()底層是通過mutex實(shí)現(xiàn)的。

彩蛋

招募令:

因?yàn)橥绫旧砉ぷ饕脖容^繁忙,很難做到日更,所以這里誠(chéng)邀廣大好友積極投稿,大家一起學(xué)習(xí)一起進(jìn)步。

可在公眾號(hào)后臺(tái)給我留言“投稿”,互加好友詳細(xì)討論投稿內(nèi)容。

當(dāng)然,其它問題也可在公眾號(hào)后臺(tái)留言,不管是生活上、工作上、心理上還是身體上的,歡迎叨擾,留言必回。


歡迎關(guān)注我的公眾號(hào)“彤哥讀源碼”,查看更多源碼系列文章, 與彤哥一起暢游源碼的海洋。

死磕 java同步系列之開篇

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。

網(wǎng)站欄目:死磕java同步系列之開篇-創(chuàng)新互聯(lián)
分享鏈接:http://bm7419.com/article24/ijice.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序企業(yè)建站、網(wǎng)站內(nèi)鏈、軟件開發(fā)、網(wǎng)站維護(hù)電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)