用Lock锁来替代synchronized,把"锁"封装成了一个对象:获取锁,释放锁,
synchronized 对锁的操作是隐式的,Lock是一个接口,需要由其子类实现:
jdk1.5以后,将同步和锁封装成了对象,并将操作锁的显示方式定义到了该对象中,将隐式动作变成了显示动作。
假设,code...代码块中throw Exception了,那么lock.unlock();就无法被执行,为了保证unlock();一定会被执行,使用try{}finallly{}
Condition对象:
精彩的地方来了:
我们希望能唤醒指定的线程。以前是生产者对应一个锁,消费者再对应着一个锁。现在可以通过已有的锁,获取两个监视器,一组监视生产者,一组监视消费者。
小结:
unlock();释放锁,通常需要定义在finally代码块中。
await();
signal();
signalAll();
synchronized 对锁的操作是隐式的,Lock是一个接口,需要由其子类实现:
Lock lock = new Lock();
void show(){
lock.lock();//获取锁
code...
lock.unlock();//释放锁
}
jdk1.5以后,将同步和锁封装成了对象,并将操作锁的显示方式定义到了该对象中,将隐式动作变成了显示动作。
假设,code...代码块中throw Exception了,那么lock.unlock();就无法被执行,为了保证unlock();一定会被执行,使用try{}finallly{}
Condition对象:
interface Condition{
await();
signal();
signalAll();
}
Lock lock = new Lock();
Condition c1 = lock.newCondition();
Condition c2 = lock.newCondition();//通过newCondition()获取一个锁的Condition实例,即监视器对象。
精彩的地方来了:
我们希望能唤醒指定的线程。以前是生产者对应一个锁,消费者再对应着一个锁。现在可以通过已有的锁,获取两个监视器,一组监视生产者,一组监视消费者。
小结:
Lock接口:
替代了同步代码块或者同步函数,将同步的隐式锁变成显示锁操作。同时更为灵活。可以一个锁上加上多组监视器。
lock();获取锁unlock();释放锁,通常需要定义在finally代码块中。
Condition接口:
替代了Object()中的wait()、notify()、notifyAll()方法。
将这些监视器方法单独进行了封装,变成Condition监视对象,可以和任意锁进行组合。await();
signal();
signalAll();
API Condition范例: