摘要:顯示鎖和內(nèi)置鎖內(nèi)置鎖優(yōu)勢代碼簡潔不會(huì)因?yàn)闆]釋放鎖,導(dǎo)致鎖泄露。顯示鎖優(yōu)勢靈活性強(qiáng),鎖的獲取可以被中斷,可以嘗試獲取鎖。接口接口主要方法如下獲取鎖嘗試獲取鎖,表示未加鎖的情況。會(huì)進(jìn)行搶鎖操作,如果獲取不到鎖,也會(huì)進(jìn)入阻塞隊(duì)列等到喚醒。
顯示鎖和內(nèi)置鎖 內(nèi)置鎖(Synchronized)優(yōu)勢
代碼簡潔
不會(huì)因?yàn)闆]釋放鎖,導(dǎo)致鎖泄露。
顯示鎖(Lock)優(yōu)勢靈活性強(qiáng),鎖的獲取可以被中斷,可以嘗試獲取鎖。
讀多寫少等場景。
用法能用內(nèi)置鎖就用內(nèi)置鎖,不能用內(nèi)置鎖,才考慮用顯示鎖。
Lock接口接口主要方法如下:
lock():獲取鎖
tryLock():嘗試獲取鎖,true表示未加鎖的情況。
unlock():釋放鎖
newCondition():創(chuàng)建一個(gè)Condition
Condition接口接口主要方法如下:
await():等待,類似wait方法
signal():喚醒,類似notify方法
signalAll():喚醒全部,類似notifAll方法
使用形式Lock lock = new ReentrantLock(); .... lock.lock();//獲取鎖 try{ //業(yè)務(wù)邏輯 }finally{ lock.unlock();//這邊要注意釋放,不然會(huì)導(dǎo)致鎖泄露 }示例
public class LockDemo { Lock lock = new ReentrantLock(); static int num = 0; public void addNum(int value) { lock.lock(); try { int temp = num; num = num + value; Thread.sleep(100); System.out.println(value + "+" + temp + "=" + num); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } static class AddThread1 extends Thread { LockDemo lockDemo; public AddThread1(LockDemo lockDemo) { this.lockDemo = lockDemo; } @Override public void run() { lockDemo.addNum(1); } } static class AddThread2 extends Thread { LockDemo lockDemo; public AddThread2(LockDemo lockDemo) { this.lockDemo = lockDemo; } @Override public void run() { lockDemo.addNum(2); } } public static void main(String[] args) { LockDemo lockDemo = new LockDemo(); AddThread1 addThread1 = new AddThread1(lockDemo); AddThread2 addThread2 = new AddThread2(lockDemo); addThread1.start(); addThread2.start(); } }
運(yùn)行結(jié)果如下:
結(jié)果顯示,跟之前synchronized結(jié)果是一樣的,加鎖解鎖成功
公平鎖:先進(jìn)來的線程先執(zhí)行
非公平鎖:后進(jìn)來的線程可能先執(zhí)行,效率較高。會(huì)進(jìn)行搶鎖操作,如果cas獲取不到鎖,也會(huì)進(jìn)入阻塞隊(duì)列等到喚醒。
ReentrantLock構(gòu)造參數(shù)有兩個(gè),默認(rèn)是非公平鎖,如果傳參是true,則是公平鎖。
public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75572.html
摘要:在并發(fā)編程學(xué)習(xí)之顯示鎖里有提過公平鎖和非公平鎖,我們知道他的使用方式,以及非公平鎖的性能較高,在源碼分析的基礎(chǔ)上,我們看看和的區(qū)別在什么地方。而非公平鎖直接嘗試獲取鎖。 在java并發(fā)編程學(xué)習(xí)之顯示鎖Lock里有提過公平鎖和非公平鎖,我們知道他的使用方式,以及非公平鎖的性能較高,在AQS源碼分析的基礎(chǔ)上,我們看看NonfairSync和FairSync的區(qū)別在什么地方。 lock方法 ...
摘要:原理全稱,當(dāng)線程去獲取資源的時(shí)候,會(huì)根據(jù)狀態(tài)值來判斷是否有鎖,如果有鎖,則加入到鏈表,鏈表里的線程,通過自旋,判斷資源是否已經(jīng)釋放,如果釋放,則獲取資源。 原理 全稱AbstractQueuedSynchronizer,當(dāng)線程去獲取資源的時(shí)候,會(huì)根據(jù)狀態(tài)值state來判斷是否有鎖,如果有鎖,則加入到鏈表,鏈表里的線程,通過自旋,判斷資源是否已經(jīng)釋放,如果釋放,則獲取資源。 AQS結(jié)構(gòu) ...
摘要:之前中提過,并發(fā)的時(shí)候,可能造成死循環(huán),那么在多線程中可以用來避免這一情況。默認(rèn),當(dāng)容量大于時(shí),開始擴(kuò)容并發(fā)數(shù),默認(rèn),直接影響和的值,以及的初始化數(shù)量。初始化的數(shù)量,為最接近且大于的辦等于的次方的值,比如,數(shù)量為,,數(shù)量為。 之前HashMap中提過,并發(fā)的時(shí)候,可能造成死循環(huán),那么在多線程中可以用ConcurrentHashMap來避免這一情況。 Segment Concurrent...
摘要:不釋放持有的鎖,釋放鎖。在調(diào)用方法前,必須持有鎖,調(diào)用喚醒,也要持有鎖。休眠一定時(shí)間后,進(jìn)入就緒狀態(tài)。這兩個(gè)都能被方法中斷當(dāng)前狀態(tài)。用法方獲取鎖判斷條件,不滿足繼續(xù)滿足執(zhí)行其他業(yè)務(wù)方獲取鎖改變條件通知為什么是而不是會(huì)一直循環(huán),直到條件滿足。 sleep和wait sleep是Thread類的方法,wait是Object的方法。 sleep可以到處使用,wait必須是在同步方法或者代碼...
摘要:線程把的值放在中。線程執(zhí)行,得到的為。,,獨(dú)占鎖,會(huì)導(dǎo)致其他所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖??梢娦?,不保證原子性。樂觀鎖,不適用鎖的情況下實(shí)現(xiàn)多線程的變量同步。性能問題在并發(fā)量較高的情況下,如果一直不成功,會(huì)一直增加的開銷。 cas原理 cas全稱Compare and swap,比較和交換的意思。原子操作,需要硬件的支持。三個(gè)基本操作數(shù):內(nèi)存地址V,舊的預(yù)期值A(chǔ),要修改...
閱讀 3431·2021-11-15 11:39
閱讀 1579·2021-09-22 10:02
閱讀 1323·2021-08-27 16:24
閱讀 3609·2019-08-30 15:52
閱讀 3432·2019-08-29 16:20
閱讀 835·2019-08-28 18:12
閱讀 563·2019-08-26 18:27
閱讀 730·2019-08-26 13:32