Condition的作用是对锁进行更精确的控制。Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,
Condition中的signalAll()相当于Object的notifyAll()方法。
不同的是,Object中的wait(),notify(),notifyAll()方法是和"同步锁"(synchronized关键字)捆绑使用的;而Condition是需要与"互斥锁"/"共享锁"捆绑使用的。
// 造成当前线程在接到信号或被中断之前一直处于等待状态。
void await()
// 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
boolean await(long time, TimeUnit unit)
// 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
long awaitNanos(long nanosTimeout)
// 造成当前线程在接到信号之前一直处于等待状态。
void awaitUninterruptibly()
// 造成当前线程在接到信号、被中断或到达指定最后期限之前一直处于等待状态。
boolean awaitUntil(Date deadline)
// 唤醒一个等待线程。
void signal()
// 唤醒所有等待线程。
void signalAll()
public interface Lock {
//获取锁,调用该方法将会获取锁,当锁获取后,从该方法返回
void lock();
//可中断地获取锁,和lock()方法的不同之处在于该方法会响应中断,即在锁的获取过程中可以中断当前线程
void lockInterruptibly() throws InterruptedException;
//尝试非阻塞的获取锁,调用该方法后会立刻返回,如果能够获取则返回true,否则返回false
boolean tryLock();
//超时地获取锁 1、当前线程在超时时间内成功获取锁。2、当前线程在超时时间内被中断。3、超时时间结束返回false。
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
//释放锁
void unlock();
//获取等待通知组件
Condition newCondition();
}
private ReentrantLock lock = new ReentrantLock(); //参数默认false,不公平锁
private ReentrantLock lock = new ReentrantLock(true); //公平锁
ReentrantLock 源码分析
ReentrantLock 实现了Lock接口,该接口的方法的实现依赖于ReentrantLock 的内部类Sync
Sync又有两个实现类,这两个实现类也是ReentrantLock的内部类分别是FairSync NonfairSync
一个是公平锁 一个是非公平的锁 默认是非公平锁
同时Sync继承了 AbstractQueuedSynchronizer 抽象类,这个抽象类中有好多的模版方法.
ReentrantLock 中好多的方法最终调用的都是AbstractQueuedSynchronizer(AQS)里面实现的
AbstractQueuedSynchronizer的介绍和原理分析
http://ifeve.com/introduce-abstractqueuedsynchronizer/
public class ReentrantLock implements Lock, java.io.Serializable {
private final Sync sync;
abstract static class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = -5179523762034025860L;
}
static final class FairSync extends Sync {
private static final long serialVersionUID = -3000897897090466540L;
}
static final class NonfairSync extends Sync {
private static final long serialVersionUID = 7316153563782823691L;
}
}