标签:java AQS ReentrantLock 此锁 ThreadLocal boolean 线程 Condition
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操作的数据都是以原子方式进行的
标签:java,AQS,ReentrantLock,此锁,ThreadLocal,boolean,线程,Condition 来源: https://www.cnblogs.com/albertXe/p/16231093.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。