java同步開篇入門簡(jiǎn)單介紹
概覽
這一篇的內(nèi)容是一個(gè)大概的介紹,大致包含三大主題: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ì)盡量用通俗易懂的語(yǔ)言把這些問題講清楚。
名詞解釋
關(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)的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家
相關(guān)文章
使用Java8實(shí)現(xiàn)觀察者模式的方法(上)
本文給大家介紹使用java8實(shí)現(xiàn)觀察者模式的方法,涉及到j(luò)ava8觀察者模式相關(guān)知識(shí),對(duì)此感興趣的朋友一起學(xué)習(xí)吧2016-02-02
詳解spring-boot actuator(監(jiān)控)配置和使用
本篇文章主要介紹了spring-boot actuator(監(jiān)控)配置和使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
手動(dòng)添加jar包進(jìn)Maven本地庫(kù)內(nèi)的方法
這篇文章主要介紹了手動(dòng)添加jar包進(jìn)Maven本地庫(kù)內(nèi)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
MyBatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)類型和Java類型的轉(zhuǎn)換
MyBatis 在處理數(shù)據(jù)庫(kù)查詢結(jié)果或傳遞參數(shù)時(shí),需要將數(shù)據(jù)庫(kù)類型與 Java 類型之間進(jìn)行轉(zhuǎn)換,本文就給大家介紹MyBatis如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)類型和 Java 類型的轉(zhuǎn)換的,需要的朋友可以參考下2024-09-09
SpringBoot集成JWT實(shí)現(xiàn)token驗(yàn)證的流程
Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519).這篇文章主要介紹了SpringBoot集成JWT實(shí)現(xiàn)token驗(yàn)證,需要的朋友可以參考下2020-01-01
Java如何將int型數(shù)組轉(zhuǎn)為String型數(shù)組
這篇文章主要介紹了Java如何將int型數(shù)組轉(zhuǎn)為String型數(shù)組,本文給大家分享具體實(shí)現(xiàn)思路結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-03-03
如何配置Eclipse實(shí)現(xiàn)定制登錄界面
本文介紹了如何配置Eclipse實(shí)現(xiàn)定制登錄界面,每一步的講解都很細(xì)致,感興趣的小伙伴可以閱讀一下2015-07-07
springboot異步@Async的使用及失效場(chǎng)景介紹
本文主要介紹了springboot異步@Async的使用及失效場(chǎng)景介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12

