Java并发读书笔记:Lock与ReentrantLock
话不多说,我们直接来看官方文档对Lock接口相关概念及功能的描述,今天又是看英文文档,翻译理解的一天。 一、Lock继承关系二、官方文档解读三、Lock接口方法解读
获取锁。如果锁不可用,则当前线程将出于线程调度目的而禁用,并处于休眠状态,直到获得锁为止。
如果当前线程未被中断,则获取锁。如果锁可用,则获取锁并立即返回。 如果锁不可用,出于线程调度目的,将禁用当前线程,该线程将一直处于休眠状态。 下面两种情形会让当前线程停止休眠状态:
当前线程出现下面两种情况时,将抛出
尝试获取锁,如果锁处于空闲状态,则获取锁,并立即返回true。如果锁不可用,则立即返回false。 该方法的典型使用:
该方法为tryLock()的重载方法,两个参数分别表示为:
如果在给定的等待时间内是空闲的并且当前线程没有被中断,则获取锁。如果锁可用,则此方法立即获取锁并返回true,如果锁不可用,出于线程调度目的,将禁用当前线程,该线程将一直处于休眠状态。 下面三种情形会让当前线程停止休眠状态:
当前线程出现下面两种情况时,将抛出InterruptedException,并清除当前线程的中断状态。
如果指定的等待时间超时,则返回false值。如果时间小于或等于0,则该方法永远不会等待。
释放锁,与lock()、tryLock()、tryLock(long,TimeUnit)、lockInterruptibly()相对应。
返回绑定到此锁实例的Condition实例。当前线程只有获得了锁,才能调用Condition实例的await()方法,并释放锁。 四、重要实现类ReentrantLock顾名思义,ReentrantLock是重入锁,关于这个重入锁,之前涉及过一些知识,在这里做整合,并稍微地补充一下。
RenntrantLock推荐的基本写法:
1、API层面的锁ReentrantLock表现为API层面的互斥锁,通过 2、可重入的重进入意味着:任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞, 实现可重入需要解决的两个关键部分:
3、可公平的关于锁公平的部分,官方文档是这样描述的(英文我就不贴了),词汇较简单,我试着翻译一下: Reentrant类的构造函数接受一个可选的公平性参数fair。这时候就出现两种选择:
公平锁往往体现处的总体吞吐量比非公平锁要低,也就是更慢。 锁的公平性并不保证线程调度的公平性,但公平锁能够减少"饥饿"发生的概率。 需要注意的是:不定时的tryLock()方法不支持公平性设置。如果锁可用,即使其他线程等待时间比它长,它也会成功获得锁。 4、等待可中断当持有线程长期不释放锁的时候,正在等待的线程可以选择放弃等待或处理其他事情。 5、锁绑定一个ReentrantLock对象可以通过newCondition()同时绑定多个Condition对象。 JDK1.6之前,ReentrantLock在性能方面是要领先于synchronized锁的,但是JDK1.6及之后版本实现了各种锁优化技术,可参考: 参考资料: (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |