reentrantLock可重入独占锁

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值