本帖最后由 wnmmp 于 2014-8-8 23:40 编辑
看了张孝祥老师的多线程,今天终于搞清楚Lock和Condition定义的缓冲区的问题了,分享一下思路,这个可以理解为单个生产者单个消费者或者多个生产者多个消费者在100个货架上按顺序依次生产消费的过程:
- class BoundedBuffer {
- // 定义一个锁,保证在屋里生产或者消费的只有一个人。如果想多个人可以同时进入房间,得定义多把锁
- final Lock lock = new ReentrantLock();
- final Condition notFull = lock.newCondition();
- final Condition notEmpty = lock.newCondition();
- // 定义100个货架
- final Object[] items = new Object[100];
- int putptr, takeptr, count;
- public void put(Object x) throws InterruptedException {
- lock.lock();
- try {
- while (count == items.length)
- // 4、如果下一个生产者进来时蛋糕数已达100就等待
- notFull.await();
- // 1、生产者进来把生产的蛋糕放入第putptr
- items[putptr] = x;
- // 2、下次生产完放在第putptr+1个货架,如果放到第99个后,putptr改为0,从头放
- if (++putptr == items.length) putptr = 0;
- // 3、放完一个,蛋糕数+1,叫醒消费者并放锁
- ++count;
- notEmpty.signal();
- } finally {
- lock.unlock();
- }
- }
- public Object take() throws InterruptedException {
- lock.lock();
- try {
- //
- while (count == 0)
- // 8、如果下一个消费者进来时蛋糕数为0就等待
- notEmpty.await();
- // 5、消费者进来,取第takeptr个蛋糕
- Object x = items[takeptr];
- // 6、下次消费去取第takeptr+1个蛋糕,如果取到第99个后,takeptr改为0,从头取
- if (++takeptr == items.length) takeptr = 0;
- // 7、取完一个,蛋糕数-1,叫醒生产者并放锁
- --count;
- notFull.signal();
- return x;
- } finally {
- lock.unlock();
- }
- }
- }
复制代码
|
|