加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 运营 > 正文

聊一聊可重入锁特别重要的话题

发布时间:2021-03-28 14:21:28 所属栏目:运营 来源:互联网
导读:法,提供了锁最基本的功能,拿到锁就返回,拿不到就等待。因此,大规模得在复杂场景中使用,是有可能因此死锁的。因此,使用这个方法得非常小心。 如果要预防可能发生的死锁,可以尝试使用下面这个方法: boolean tryLock(long timeout, TimeUnit unit) throw

法,提供了锁最基本的功能,拿到锁就返回,拿不到就等待。因此,大规模得在复杂场景中使用,是有可能因此死锁的。因此,使用这个方法得非常小心。

如果要预防可能发生的死锁,可以尝试使用下面这个方法:

  • boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException:尝试获取锁,等待timeout时间。同时,可以响应中断。

这是一个比单纯lock()更具有工程价值的方法,如果大家阅读过JDK的一些内部代码,就不难发现,tryLock()在JDK内部被大量的使用。

与lock()相比,tryLock()至少有下面一个好处:

  1. 可以不用进行无限等待。直接打破形成死锁的条件。如果一段时间等不到锁,可以直接放弃,同时释放自己已经得到的资源。这样,就可以在很大程度上,避免死锁的产生。因为线程之间出现了一种谦让机制
  2. 可以在应用程序这层进行进行自旋,你可以自己决定尝试几次,或者是放弃。
  3. 等待锁的过程中可以响应中断,如果此时,程序正好收到关机信号,中断就会触发,进入中断异常后,线程就可以做一些清理工作,从而防止在终止程序时出现数据写坏,数据丢失等悲催的情况。

当然了,当锁使用完后,千万不要忘记把它释放了。不然,程序可能就会崩溃啦~

  • void unlock() :释放锁

此外, 重入锁还有一个不带任何参数的tryLock()。

  • public boolean tryLock()

这个不带任何参数的tryLock()不会进行任何等待,如果能够获得锁,直接返回true,如果获取失败,就返回false,特别适合在应用层自己对锁进行管理,在应用层进行自旋等待。

重入锁的实现原理

重入锁内部实现的主要类如下图:

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读