java锁 AQS 线程池 ThreadLocal
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操作的数据都是以原子方式进行的