摘要:在包中有很多的實現類,常用的有,其實現都依賴類,實現思路都大同小異。類調用,進而調用類讓操作系統(tǒng)進行和,從而達到線程的阻塞和恢復。
在java.util.concurrent.locks包中有很多Lock的實現類,常用的有ReentrantLock、ReentrantReadWriteLock,其實現都依賴java.util.concurrent.AbstractQueuedSynchronizer類,實現思路都大同小異。
同時,Lock提供了Condition接口,類似與Object的wait/notify,但比后者要方便的多、靈活的多。
ReentrantLock的調用過程ReentrantLock把所有Lock接口的操作都委派到一個Sync類上,該類繼承了AbstractQueuedSynchronizer。
static abstract class Sync extends AbstractQueuedSynchronizer
Sync又有兩個子類:
final static class NonfairSync extends Sync final static class FairSync extends Sync
Reentrant.lock()方法的調用過程(默認非公平鎖):
AbstractQueuedSynchronizer通過構造一個基于阻塞的CLH隊列容納所有的阻塞線程,而對該隊列的操作均通過Lock-Free(CAS)操作,但對已經獲得鎖的線程而言,ReentrantLock實現了偏向鎖的功能。
非公平鎖的代碼中總是優(yōu)先嘗試當前是否有線程持有鎖,一旦沒有任何線程持有鎖,那么非公平鎖就霸道的嘗試將鎖“占為己有”。如果在搶占鎖的時候失敗就和公平鎖一樣老老實實的去請求。也即是說公平鎖和非公平鎖只是在入AQS的CLH隊列之前有所差別,一旦進入了隊列,所有線程都是按照隊列中先來后到的順序請求鎖。
Lock類調用LockSupport,LockSupport進而調用Unsafe類讓操作系統(tǒng)進行park和unpack,從而達到線程的阻塞和恢復。
ReentrantReadWriteLock類適用于有很多線程都從某個數據結構中讀取數據而很少有線程對其進行修改的場景,允許讀取器線程共享訪問,但與寫入器線程依然是互斥的。
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); private Lock readLock = rwl.readLock(); //得到一個可被多個讀操作共用的讀鎖,但它會排斥所有寫操作 private Lock writeLock = rwl.writeLock(); //得到一個寫鎖,它會排斥所有其他的讀操作和寫操作 public double getTotalBalance(){ readLock.lock(); try { ... } finally { readLock.unlock(); } } public void transfer(){ writeLock.lock(); try { ... } finally { writeLock.unlock(); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67031.html
摘要:整個包,按照功能可以大致劃分如下鎖框架原子類框架同步器框架集合框架執(zhí)行器框架本系列將按上述順序分析,分析所基于的源碼為。后,根據一系列常見的多線程設計模式,設計了并發(fā)包,其中包下提供了一系列基礎的鎖工具,用以對等進行補充增強。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首發(fā)于一世流云專欄:https...
摘要:用于生成虛擬機當前時刻的線程快照。線程快照就是當前虛擬機內每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的主要目的就是定位線程出現長時間停頓的原因,如線程死鎖死循環(huán)請求外部資源導致的長時間等待等都是導致線程長時間停頓的常見原因。 在JDK的命令行中,一般開發(fā)人員最耳熟能詳的肯定就是java,javac,javap等常用命令,不過在jdk/bin下還有許多其他的命令行工具,它們被用來監(jiān)...
Lock對象 同步代碼依賴于簡單的可重入鎖,這種鎖易于使用,但有許多限制,java.util.concurrent.locks包支持更復雜的鎖定語法,我們不會詳細檢查這個包,而是將重點放在其最基本的接口Lock上。 Lock對象的工作方式與同步代碼使用的隱式鎖定非常相似,與隱式鎖一樣,一次只有一個線程可以擁有一個Lock對象,Lock對象還通過其關聯(lián)的Condition對象支持wait/notif...
閱讀 917·2021-10-27 14:14
閱讀 1741·2021-10-11 10:59
閱讀 1315·2019-08-30 13:13
閱讀 3152·2019-08-29 15:17
閱讀 2750·2019-08-29 13:48
閱讀 488·2019-08-26 13:36
閱讀 2082·2019-08-26 13:25
閱讀 857·2019-08-26 12:24