在lock中提供了与之关联的条件,一个锁可能关联一个或多个条件,这些条件通过condition接口声明。目的是运行线程获取锁并且查看等待某一个条件是否满足,如果不满足则挂起直到某个线程唤醒它们。condition接口提供了挂起线程和唤起线程的机制;
       介绍下下面一堆代码所做的事情:使用了5个线程设置(生产)一个数值,使用5个线程移除(消费)这个数值; 
在add 和 remoe中使用Condition来代替监视器锁的wait操作和唤醒操作。
       值得注意的是:  
1. 读写线程数量如果不对等,将会出现死锁。 
2. 所有的条件Condition必须使用对等的锁对象来创建lock.newCondition(); 
3. 条件必须用在lock() 和 unlock() 方法之间。 
4. 在判定条件是否满足,需要在循环中判定,未满足条件的不能离开循环体,否则数据将得不到我们想要的结果 

5. 调用await()方法进入休眠的线程可能会被中断,所以必须处理InterruptedException 异常

程序运行结果:可以看出以上的结果:有值了,才能被取走,被取走了,才能被生产一个值。

ReentrantLock和ReentrantReadWriteLock(有两种锁:一种为读操作锁,通过ReadWriteLock接口的readLock()方法获取,写操作锁通过ReadWriteLock接口的writeLock()方法获取。)类构造器都有一个布尔参数fair,默认为false,即非公平状态,当很多线程在等待锁时,随机选择一个来访问临界区,若fair值为true,则成为公平模式,选择的是等待时间最长的线程。