【锁】1 Lock的优势与特性

Lock和synchronized是最常见的锁,用于控制对共享资源的访问。Lock不是用来代替synchronized的,而是synchronized不满足要求时,提供更高级的功能。Lock接口常见实现类是ReentrantLock和ReadWriteLock。

synchronized的缺点,参见之前的小节。

  1. 锁效率低
  • 锁的释放情况少。synchronized监视器锁在方法或代码块正常退出和异常时释放锁。
  • 试图获得锁时不能设置超时、不能中断一个正在试图获得锁的线程。
  1. 不够灵活
    相对于读写锁,加锁和释放的时机单一,每个锁只有单一条件(锁定某个对象),可能不够。
  2. 无法知道是否成功获取到锁。
    例如Lock的tryLock方法

1 Lock接口分析

public interface Lock {
    // 获取锁
    void lock();
    // 获取锁时可以被中断
    void lockInterruptibly() throws InterruptedException;
    boolean tryLock();
    // 超时就放弃
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    // 解锁
    void unlock();
    Condition newCondition();
}
  • Lock不会像synchronized在异常时释放锁,因此需要在finally调用unlock,确保锁被释放。
  • lock()方法不能被中断,一旦死锁,会陷入永久等待。
  • tryLock()用来尝试获取锁,如果当前锁未被其他线程占用,则获取锁,并返回true;否则返回false。方法立即返回,即使拿不到锁也会等待。

tryLock代码规范,参考注释

Lock lock = new ReentrantLock();
if(lock.tryLock()) {
    try {
    } finally {
        lock.unlock();
    }
}

线程等待Lock锁时是WAITING状态,不可能是BLOCKED.

2 Lock的可见性保证

Lock的可见性与synchronized相同,可以参考happens-before原则。解锁操作对之后的加锁操作可见。

lock和unlock对齐内存交互操作中的lock和unlock操作。

3 演示示例

本文案例代码位置:https://gitee.com/dtyytop/advanced-java

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值