美文网首页JUC并发相关
7. 并发终结之Lock接口

7. 并发终结之Lock接口

作者: 涣涣虚心0215 | 来源:发表于2020-09-22 00:56 被阅读0次

    Lock是显式锁的接口,默认实现是ReentrantLock。

    方法摘要

    public interface Lock {
        //获取锁
        void lock();
        //如果当前线程未中断,则获取锁
        void lockInterruptibly() throws InterruptedException;
        //尽在调用锁为空闲时,才会获取锁
        boolean tryLock();
        //如果锁在给定时间内空闲,且当前线程未中断,则获取锁
        boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
        //释放锁
        void unlock();
        //返会绑定在此Lock实例上的Condition实例
        Condition newCondition();
    }
    

    Lock.unlock方法要放在finally语句块中,防止临界区异常之后不能正常释放锁而导致锁泄漏,而不像内部锁直接由JIT代为规避锁泄漏的问题。

    Lock显式锁调度

    ReentrantLock即支持公平锁也支持非公平锁。
    公平锁意味着增加了线程的上下文切换,适合持有锁时间相对长或者申请锁时间较长的情形。
    非公平锁是默认实现,增加了吞吐量,但是有可能造成饥饿。

    显式锁和内部锁

    • 在使用方面
      内部锁基于代码块,简单易用,但是不太灵活,代码块不能跨方法,但是不会造成锁泄漏;另外没有提供监测锁的工具方法。
      显式锁更加灵活,还提供tryLock()方法去尝试获取锁,而不会直接进入阻塞状态,且提供一些监控方法比如isLocked(), getQueueLength()检查等待线程数量等。
    • 在调度方面
      内部锁只支持非公平锁,显式锁支持公平和非公平锁。
      JDK1.6之后对内部锁进行了优化,包括锁消除,锁粗化,偏向锁,轻量级锁,重量级锁。

    相关文章

      网友评论

        本文标题:7. 并发终结之Lock接口

        本文链接:https://www.haomeiwen.com/subject/lwujlktx.html