java中的锁 Lock
博客专区 > 小鱼-- 的博客 > 博客详情
java中的锁 Lock
小鱼-- 发表于7个月前
java中的锁 Lock
  • 发表于 7个月前
  • 阅读 9
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。

Lock

synchronized块或方法可以隐式的获取锁,但是它将锁的获取和释放固化了,即先获取再释放。

Lock,在JavaSE5之后,在使用时需要显式的获取和释放锁,相比于synchronized,拥有锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等同步特性。

 

Lock接口提供的synchronized关键字不具备的主要特性

特性  描述
尝试非阻塞的获取锁 当前线程尝试获取锁,如果这一时刻锁没有被其它线程获取到,则成功获取并持有锁
能被中断地获取锁  与synchronized不同,获取到的锁能够响应中断,当获取到锁的线程被中断时,中断异常将会抛出,同时锁会被释放
超时获取锁 在指定的截止时间之前获取锁,如果截止时间到了仍旧无法获取锁,则返回

Lock接口API

方法名称 描述
void lock() 获取锁。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态
void lockInterruptibly() throws InterruptedException
  • 如果当前线程未被中断,则获取锁。
  • 如果锁可用,则获取锁,并立即返回。
  • 如果锁不可用,出于线程调度目的,将禁用当前线程,并且在发生以下两种情况之一以前,该线程一直处于休眠状态:
  1. 锁由当前线程获得
  2. 其他某个线程中断当前线程,并且支持对锁获取的中断
  • 如果当前线程存在以下情况,则将抛出InterruptedException,并清除当前线程的中断状态
  1. 在进入此方法时已经设置了该线程的中断状态
  2. 在获取锁时被中断,并且支持对锁获取的中断
boolean tryLock() 尝试非阻塞的获取锁。
仅在调用时锁为空闲状态才获取锁。如果锁可用,则获取锁,并立即返回值true,如果锁不可用,则此方法将立即返回值false
boolean tryLock(long time,TimeUnit unit) throws InterruptedException

超时的获取锁,当前线程在以下3种情况下会返回:

  1. 当前线程在超时时间内获得了锁
  2. 当前线程在超时时间内被中断
  3. 超时时间结束,返回false
void unlock() 释放锁
Condition newCondition() 获取等待通知组件,该组件和当前的锁绑定,当前线程只有获得了锁,才能调用该组件的wait()方法,而调用后,当前线程将释放

 

标签: java并发编程
共有 人打赏支持
粉丝 0
博文 15
码字总数 5080
×
小鱼--
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: