JAVA并发编程-线程间协作(Object监视器方法与Condition)

本文介绍了JAVA并发编程中的线程间协作,通过生产者与消费者模型阐述了Object的wait(), notify(), notifyAll()方法以及Condition在并发控制中的应用。分析了两者之间的差异,强调Condition可以更精确地控制线程的唤醒和资源锁的获取,提供了交替执行的示例。" 133232515,20038985,WPF DataGrid实现Excel风格筛选功能,"['WPF', '.NET', '数据展示']
摘要由CSDN通过智能技术生成

JAVA并发编程第一篇

今天是2016年2月29日,四年一次,我琢磨着要写一篇blog...毕竟过了今天需要等四年啊!!!


    说到线程间协作,不得不提到经典的生产者与消费者模型:有一个商品队列,生产者想队列中添加商品,消费者取出队列中的商品;显然,如果队列为空,消费者应该等待生产者产生商品才能消费;如果队列满了,生产者需要等待消费者消费之后才能生产商品。队列就是这个模型中的临界资源,当队列为空时,而消费者获得了该对象的锁,如果不释放,那么生产者无法获得对象锁,而消费者无法消费对象,就进入了死锁状态;反之队列满时,生产者不释放对象锁也会造成死锁。这是我们不希望看到的,所以就有了线程间协作来解决这个问题。


    其实说到生产者与消费者模型,我们不能简单的知道怎么实现,而是需要知这种模型的使用场景:主要是为了复用和解耦,常见的消息框架(非常经典的一种生产者消费者模型的使用场景)ActiveMQ。发送端和接收端用Topic进行关联。



    JAVA语言中,如何实现线程间协作呢?比较常见的方法就是利用Object.wait(),Object.notify()和Condition。

先看看这几个方法究竟有什么作用?为什么利用它们就可以实现线程间协作了呢?


首先分析一下wait()/notify()/notifyAll()这三个Object监视器方法,比较早的方法,JDK1.5之前

1、上述三个方法都是Object类中的本地方法,且为final,无法被重写;且这三个方法都必须在同步块或者同步方法中才能执行;

2、当前线程必须拥有该对象的锁,才能执行wait()方法,wait()方法会阻塞当前线程,并且释放对象锁;

3、notify()方法可以唤醒一个(1/N)正在等待这个资源锁的线程,但是不保证被唤醒的线程一定可以获得这个对象锁。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值