春招修仙系列 —— Lock

概述:

显示锁,jdk1.5之后开始引入的排他锁

显示锁的调度:

ReentrantLock既支持非公平锁也支持公平锁
ReentrantLock(boolean fait) true则是公平锁,默认使用的非公平策咯

基于AQS :

AQS中维了一个state(状态值,代表共享资源)和一个FIFO等待队列(多线程征用资源被阻塞时会进入到该队列)
AQS定义资源有两种方式,独占(只能有一个线程执行,ReentrantLock),共享(多个线程可同时执行 CountDownLacth)

主要方法:

isHeldExclusively() 该线程是否正在独占资源
tryAcquire(int) 独占方式,尝试获取资源,成功返回true,失败返回false tryRelease(int) 独占方式,尝试释放资源,成功返回true,失败返回false
tryRelease(int) 独占方式,尝试释放资源,成功返回true,否则返回flase
tryAcquireShared(int) 共享方式,尝试获取资源,负数表示失败,0表示成功,单没有剩余资源,整数表示成功,且有剩余资源
tryReleaseShared(int) 共享方式,尝试释放资源,如果释放后允许唤醒后续等待节点,返回true,否则返回flase

以ReentrantLock为例,state初始化为0,表示未锁定状态。A线程lock()时,会调用tryAcquire()独占该锁并将state+1。此后,其他线程再tryAcquire()时就会失败,直到A线程unlock()到state=0(即释放锁)为止,其它线程才有机会获取该锁。当然,释放锁之前,A线程自己是可以重复获取此锁的(state会累加),这就是可重入的概念。但要注意,获取多少次就要释放多么次,这样才能保证state是能回到零态的。

猜你喜欢

转载自blog.csdn.net/Kirito19970409/article/details/86545753
今日推荐