reentrantLock可重入独占锁:
“独占”,就是在同一时刻只能有一个线程获取到锁,而其它获取锁的线程只能处于同步队列中等待,只有获取锁的线程释放了锁,后继的线程才能够获取锁。
“可重入”,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。
a.公平锁和非公平锁:
当B线程请求锁,发现A线程正持有锁,就陷入阻塞,当A线程释放锁,B线程还未获得锁的时候,C线程来了并请求锁
公平锁:C线程请求锁,C线程发现B线程阻塞队列里有B线程,就进入阻塞队列等待,同时,B线程发现A释放锁,就从等待队列里唤醒,并持有锁。
非公平锁:C线程请求锁,C线程与B线程竞争,存在B继续进入阻塞,同时,C线程持有锁的可能性
总结:
1.公平锁维护了先来先处理的顺序,进行锁的请求,所以,公平锁不会产生饥饿
2.非公平锁每次释放锁后,请求锁的线程相互竞争,随机选择一个线程持有锁。
3.在锁释放时,从阻塞队列顺序唤醒线程处理请求是公平锁,相互竞争随机选取是非公平锁
b.ReentrantLock锁支持公平锁和非公平锁
1.中断响应(lockInterruptibly)等待锁的过程中可以取消对锁的请求---即阻塞可以被中断
2.锁申请等待限时(tryLock)指定等待锁的时间,过期即放弃---指定时间阻塞,过期就放弃
以上两种机制都可以防止死锁的产生
c.public ReentrantLock(boolean fair):通过该构造方法设置锁的公平性
思考:如果是可重入锁的公平锁,那么如何体现可重入性呢?之前这点一直有些想不通,感觉可重入锁就只有非公平的锁呀。
公平锁的重点,里面用了队列来实现锁,如果队列中第一个为空或者自己是第一个,就自己再去获取资源,如果有值了,就判断一个自己之前是不是已经获取过资源了,获取了就在重入一下,重入失败就返回false,表示获取资源失败
参考:《ReentrantLock之公平锁,可重入的理解》https://blog.csdn.net/u011381576/article/details/80771881