1. JUC 簡介
在 Java 5.0 提供了java.util.concurrent(簡稱JUC)包,在此包中增加了在并發編程中很常用的工具類,
用于定義類似于線程的自定義子系統,包括線程池,異步 IO 和輕量級任務框架;還提供了設計用于多線程上下文中
java并發包常用類,的 Collection 實現等;
JUC包JUC提供的一些實現:
Atomic : AtomicInteger? 原子操作類
Locks : Lock, Condition, ReadWriteLock? 可重入讀寫鎖
juc并發工具、Collections : Queue, ConcurrentMap 并發集合
Executer : Future, Callable, Executor 線程執行池,異步Future等
Tools : CountDownLatch, CyclicBarrier, Semaphore 減數器,等待器,信號量
2.JUC 核心
java打包成jar包,java提供了synchonized關鍵字實現悲觀鎖機制,以求指令原子性,內存可見性,操作互斥性
但是synchonized鎖機制會導致性能下降,控制的顆粒度也粗,所以JUC的核心理念是不通過重量級的synchonized來解決并發問題
我個人理解的JUC三大核心是 :1.volatile 關鍵字保證內存可見性;
2.CAS(Compare-And-Swap) 算法 保證數據的原子性;
并發包,3.AQS隊列?? (Unsafe類的park操作是調用Posix的信號量互斥量 condition,mutex那套來實現)
AQS的內部隊列采用的是CLH隊列鎖模型,CLH隊列是由一個一個結點(Node)構成的。Node類中有兩個常量SHARE和EXCLUSIVE,顧名思義這兩個常量用于表示這個結點支持共享模式還是獨占模式,共享模式指的是允許多個線程獲取同一個鎖而且可能獲取成功,獨占模式指的是一個鎖如果被一個線程持有,其他線程必須等待。多個線程讀取一個文件可以采用共享模式,而當有一個線程在寫文件時不會允許另一個線程寫這個文件,這就是獨占模式的應用場景。
找的一張AQS隊列
JUC的各種功能都是通過實現自定義sync類繼承AQS(AbstractQueuedSynchronizer)類,sync有公平鎖,非公平鎖;也可以區分為獨占sync,共享sync。AQS源碼一半好懂一半晦澀,比如 do{ node.prev = pred = pred.prev; }while(pred.waitStatus >0); 這一段,我也有過空指針疑問,還有比如,為什么要倒序喚醒等等,所以我附上一份個人覺得比較好的AQS源碼解讀:共享鎖:https://www.jianshu.com/p/1161d33fc1d0
ucc,獨占鎖:https://www.jianshu.com/p/71449a7d01af
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态