1. 程式人生 > 其它 >java鎖 AQS 執行緒池 ThreadLocal

java鎖 AQS 執行緒池 ThreadLocal

JUC

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操作的資料都是以原子方式進行的