摘要:顯示鎖和內置鎖內置鎖優勢代碼簡潔不會因為沒釋放鎖,導致鎖泄露。顯示鎖優勢靈活性強,鎖的獲取可以被中斷,可以嘗試獲取鎖。接口接口主要方法如下獲取鎖嘗試獲取鎖,表示未加鎖的情況。會進行搶鎖操作,如果獲取不到鎖,也會進入阻塞隊列等到喚醒。
顯示鎖和內置鎖 內置鎖(Synchronized)優勢
代碼簡潔
不會因為沒釋放鎖,導致鎖泄露。
顯示鎖(Lock)優勢靈活性強,鎖的獲取可以被中斷,可以嘗試獲取鎖。
讀多寫少等場景。
用法能用內置鎖就用內置鎖,不能用內置鎖,才考慮用顯示鎖。
Lock接口接口主要方法如下:
lock():獲取鎖
tryLock():嘗試獲取鎖,true表示未加鎖的情況。
unlock():釋放鎖
newCondition():創建一個Condition
Condition接口接口主要方法如下:
await():等待,類似wait方法
signal():喚醒,類似notify方法
signalAll():喚醒全部,類似notifAll方法
使用形式Lock lock = new ReentrantLock(); .... lock.lock();//獲取鎖 try{ //業務邏輯 }finally{ lock.unlock();//這邊要注意釋放,不然會導致鎖泄露 }示例
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(); } }
運行結果如下:
結果顯示,跟之前synchronized結果是一樣的,加鎖解鎖成功
公平鎖:先進來的線程先執行
非公平鎖:后進來的線程可能先執行,效率較高。會進行搶鎖操作,如果cas獲取不到鎖,也會進入阻塞隊列等到喚醒。
ReentrantLock構造參數有兩個,默認是非公平鎖,如果傳參是true,則是公平鎖。
public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75572.html
摘要:在并發編程學習之顯示鎖里有提過公平鎖和非公平鎖,我們知道他的使用方式,以及非公平鎖的性能較高,在源碼分析的基礎上,我們看看和的區別在什么地方。而非公平鎖直接嘗試獲取鎖。 在java并發編程學習之顯示鎖Lock里有提過公平鎖和非公平鎖,我們知道他的使用方式,以及非公平鎖的性能較高,在AQS源碼分析的基礎上,我們看看NonfairSync和FairSync的區別在什么地方。 lock方法 ...
摘要:原理全稱,當線程去獲取資源的時候,會根據狀態值來判斷是否有鎖,如果有鎖,則加入到鏈表,鏈表里的線程,通過自旋,判斷資源是否已經釋放,如果釋放,則獲取資源。 原理 全稱AbstractQueuedSynchronizer,當線程去獲取資源的時候,會根據狀態值state來判斷是否有鎖,如果有鎖,則加入到鏈表,鏈表里的線程,通過自旋,判斷資源是否已經釋放,如果釋放,則獲取資源。 AQS結構 ...
摘要:之前中提過,并發的時候,可能造成死循環,那么在多線程中可以用來避免這一情況。默認,當容量大于時,開始擴容并發數,默認,直接影響和的值,以及的初始化數量。初始化的數量,為最接近且大于的辦等于的次方的值,比如,數量為,,數量為。 之前HashMap中提過,并發的時候,可能造成死循環,那么在多線程中可以用ConcurrentHashMap來避免這一情況。 Segment Concurrent...
摘要:不釋放持有的鎖,釋放鎖。在調用方法前,必須持有鎖,調用喚醒,也要持有鎖。休眠一定時間后,進入就緒狀態。這兩個都能被方法中斷當前狀態。用法方獲取鎖判斷條件,不滿足繼續滿足執行其他業務方獲取鎖改變條件通知為什么是而不是會一直循環,直到條件滿足。 sleep和wait sleep是Thread類的方法,wait是Object的方法。 sleep可以到處使用,wait必須是在同步方法或者代碼...
摘要:線程把的值放在中。線程執行,得到的為。,,獨占鎖,會導致其他所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。可見性,不保證原子性。樂觀鎖,不適用鎖的情況下實現多線程的變量同步。性能問題在并發量較高的情況下,如果一直不成功,會一直增加的開銷。 cas原理 cas全稱Compare and swap,比較和交換的意思。原子操作,需要硬件的支持。三個基本操作數:內存地址V,舊的預期值A,要修改...
閱讀 3419·2021-11-15 11:39
閱讀 1552·2021-09-22 10:02
閱讀 1308·2021-08-27 16:24
閱讀 3596·2019-08-30 15:52
閱讀 3412·2019-08-29 16:20
閱讀 823·2019-08-28 18:12
閱讀 549·2019-08-26 18:27
閱讀 714·2019-08-26 13:32