java Lock(显示锁)

1.显示锁与内置锁对比

  1. 内置锁在代码块调用结束后会自动释放锁,但是显示锁必须自己控制加锁和释放锁,因此使用显示锁更加危险(忘记释放锁)。
  2. 内置锁不支持中断,阻塞的线程会一直等待直到拥有锁。而显示锁支持中断并且在处理锁的不可用问题上更加灵活(例如调用tryLock不会阻塞并且可以定时和轮询)。
  3. 显示锁并不能代替内置锁,只有当内置锁不能满足需求是才可以考虑显示锁。内置锁要比显示锁更安全,内置锁作为JVM的内置属性,可以检测死锁,但是显示锁不行。
  4. 内置锁和显示锁都支持重入。

2.显示锁的基本功能

public interface Lock {
    void lock();
    void lockInterruptibly() throws InterruptedException;
    boolean tryLock();
    boolean tryLock(long timeout, TimeUnit unit)() throws InterruptedException;;
    void unLock();
    Condition newCondition();
}
  • lock()与内置锁类似,如果请求不到锁会阻塞并且不支持中断。
  • lockInterruptibly()请求加锁,如果请求不到锁会发生阻塞,在阻塞过程中允许中断。
  • tryLock()请求加锁,如果加锁不成功会返回false,不会发生阻塞。
  • tryLock(long timeout, TimeUnit unit)()请求加锁,如果加锁不成功会在规定的时间内阻塞,超时后会返回,支持中断。
  • unLock()不论选择哪种请求加锁方式,都必须使用unLock释放锁。

ReentrantLock是Lock接口的实现类。

3. 读锁和写锁

读锁允许多个线程同时读取,但是写锁只允许一个线程占用,因此,一个资源可以被多个读操作访问,或者被一个写操作访问,并且读写不能同时进行。在多处理器环境被频繁读取的数据结构,使用读锁和写锁结合使用会提高性能,但是在其他情况下,读锁和写锁的性能不如独占锁,因为读锁写锁的复杂性更高。

ReentrantReadWriteLock

  • Acquisition order:分为公平模式和不公平模式,不公平模式读线程和写线程获得读锁和写锁的顺序不确定,但是性能要优于公平模式。公平模式下读线程需要等到前面所有的写线程都执行完毕释放写锁。但是不用等前面的读线程执行完毕。而写线程需要等到前面的读线程和写线程全部执行完毕。
  • Reentrancy:读锁和写锁都支持重入,读锁重入读锁,写锁重入写锁。写锁重入读锁但是不可以读锁重入写锁。
  • Lock downgrading:获得读锁可以降级为写锁,即先请求写锁,然后获得读锁并释放写锁。但是读锁不能升级为写锁。
  • Interruption of lock acquisition:读锁和写锁都支持中断。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值