java鎖 AQS 執行緒池 ThreadLocal
阿新 • • 發佈:2022-05-06
java鎖
關鍵資訊
-
LockSupport LockSupport中的park() 和 unpark() 的作用分別是阻塞執行緒和解除阻塞執行緒
-
Condition 需要和Lock聯合使用,它的作用是代替Object監視器方法,可以通過await(),signal()來休眠/喚醒執行緒
ReentrantLock
-
可重入的互斥鎖
-
公平鎖 FIFO等待佇列
-
非公平鎖 不管在不在佇列開頭都能獲取鎖
-
有一個成員變數sync,sync是Sync型別;Sync是一個抽象類,而且它繼承於AQS
函式列表
// 建立一個 ReentrantLock ,預設是“非公平鎖”。 ReentrantLock() // 建立策略是fair的 ReentrantLock。fair為true表示是公平鎖,fair為false表示是非公平鎖。 ReentrantLock(boolean fair) // 查詢當前執行緒保持此鎖的次數。 int getHoldCount() // 返回目前擁有此鎖的執行緒,如果此鎖不被任何執行緒擁有,則返回 null。 protected Thread getOwner() // 返回一個 collection,它包含可能正等待獲取此鎖的執行緒。 protected Collection<Thread> getQueuedThreads() // 返回正等待獲取此鎖的執行緒估計數。 int getQueueLength() // 返回一個 collection,它包含可能正在等待與此鎖相關給定條件的那些執行緒。 protected Collection<Thread> getWaitingThreads(Condition condition) // 返回等待與此鎖相關的給定條件的執行緒估計數。 int getWaitQueueLength(Condition condition) // 查詢給定執行緒是否正在等待獲取此鎖。 boolean hasQueuedThread(Thread thread) // 查詢是否有些執行緒正在等待獲取此鎖。 boolean hasQueuedThreads() // 查詢是否有些執行緒正在等待與此鎖有關的給定條件。 boolean hasWaiters(Condition condition) // 如果是“公平鎖”返回true,否則返回false。 boolean isFair() // 查詢當前執行緒是否保持此鎖。 boolean isHeldByCurrentThread() // 查詢此鎖是否由任意執行緒保持。 boolean isLocked() // 獲取鎖。 void lock() // 如果當前執行緒未被中斷,則獲取鎖。 void lockInterruptibly() // 返回用來與此 Lock 例項一起使用的 Condition 例項。 Condition newCondition() // 僅在呼叫時鎖未被另一個執行緒保持的情況下,才獲取該鎖。 boolean tryLock() // 如果鎖在給定等待時間內沒有被另一個執行緒保持,且當前執行緒未被中斷,則獲取該鎖。 boolean tryLock(long timeout, TimeUnit unit) // 試圖釋放此鎖。 void unlock()
ReadWriteLock
- 唯一實現類ReentrantReadWriteLock
CountDownLatch
- 包含sync物件
CyclicBarrier
-
包含"ReentrantLock物件lock"和"Condition物件trip",它是通過獨佔鎖實現的
-
CountDownLatch的作用是允許1或N個執行緒等待其他執行緒完成執行;而CyclicBarrier則是允許N個執行緒相互等待。
-
CountDownLatch的計數器無法被重置;CyclicBarrier的計數器可以被重置後使用,因此它被稱為是迴圈的barrier。
Semaphore
- Semaphore包含sync物件
- 本質是一個共享鎖
- acquire()來獲取訊號量
- release()來釋放訊號量
AQS
AQS AbstractQueuedSynchronizer
- AQS是獨佔鎖(例如,ReentrantLock)和共享鎖(例如,Semaphore)的公共父類
- 獨佔鎖 ReentrantLock,ReentrantReadWriteLock.WriteLock
- 共享鎖 ReentrantReadWriteLock.ReadLock,CyclicBarrier, CountDownLatch和Semaphore都是共享鎖
CLH
- CLH佇列是AQS中“等待鎖”的執行緒佇列 FIFO
- 併發條件下不會阻塞,而是通過自旋鎖和 CAS 保證節點插入和移除的原子性
CAS Compare And Swap
- 通過CAS操作的資料都是以原子方式進行的