重入锁使用的是
ReentrantLock
类。
说明
重入锁代码
ReentrantLock lock = new ReentrantLock();
lock.lock();
//其他代码
lock.unlock();
在退出临界区的时候,必须释放锁,否则,其他线程就没有机会再访问临界区了。在同一个线程中,重入锁可以反复进入,一个线程连续两次获取同一把锁,是可以的,但是也得同时释放两次锁。
中断
lockInterruptibly()
该方法,获取锁时,其他线程已经获取锁,则进入等待,等待过程可以响应中断。
锁申请等待限时
tryLock()
不进行等待,获取锁,获取成功返回 true,失败则返回 false。
tryLock(long timeout, TimeUnit unit)
立即获取锁,则返回true,如果所被其他线程获取,则进行等待,等待指定时间,如果还未获取,则返回 false。
公平锁
构造方法 ReentrantLock(boolean fair)
中有个 fair ,如果为 true 则表示为公平锁。默认是 false 。公平锁必然要求系统维护一个有序队列,因此公平锁的实现成本比较高。
方法
方法名 | 返回值 | 说明 |
---|---|---|
lock() | void | 获得锁,不会响应中断。 |
unlock() | void | 释放锁。 |
lockInterruptibly() | void | 获得锁,可响应中断,会抛出 InterruptedException 异常。 |
tryLock() | boolean | 获得放锁,如果获得成功,返回 true ,获得失败,返回 false 。 |
tryLock(long timeout, TimeUnit unit) | boolean | 指定时间内等待获得放锁,如果获得成功,返回 true ,获得失败,返回 false 。timeout 为等待的时间长度,TimeUnit为等待时间长度的单位。 |
isHeldByCurrentThread() | boolean | 查询当前线程是否持有锁,true表示持有,false表示未持有。 |
Condition
Condition
对象和 wait()
和 notify()
方法的作用是大致相同的。但是 wait()
和 notify()
方法是和 synchronized
关键字合作使用的,而 Conditon
是与重入锁相关联的。
方法
方法名 | 返回值 | 说明 |
---|---|---|
await() | void | 会使当前线程等待,并释放锁,当其他线程中使用 signal 或者 signalAll方法时,线程会重新获得锁并继续执行。 |
await(long time, TimeUnit unit) | boolean | 使当前线程等待直到发出信号或中断,或指定的等待时间过去。 |
awaitNanos(long nanosTimeout) | long | 使当前线程等待直到发出信号或中断,或指定的等待时间过去。 |
awaitUninterruptibly() | void | 与 await 方法基本相同,但是它不会再等待过程中响应中断。 |
awaitUntil(Date deadline) | boolean | 使当前线程等待直到发出信号或中断,或者指定的最后期限过去。 |
signal() | void | 用于唤醒一个等待中的线程。 |
signalAll() | void | 唤醒所有在等待中的线程。 |