多线程-多生产者多消费者问题JDK1.5新特性

用Lock锁来替代synchronized,把"锁"封装成了一个对象:获取锁,释放锁,


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范例:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>