生产者消费者模型内置锁版

生产者消费者模型内置锁版

Posted by candy1126xx on June 1, 2017

缓冲区

public class Storage {
    // 仓库最大存储量
    private final int MAX_SIZE = 100;

    // 仓库存储的载体
    private LinkedList<Object> list = new LinkedList<Object>();

    // 生产产品
    public void produce() {
        synchronized (list) {
            // 满了
            while (list.size() == MAX_SIZE) {
                try {
                    list.wait();
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            // 不满           
            list.add(new Object());
            list.notifyAll();
        }
    }

    // 消费产品
    public void consume() {
        synchronized (list) {
            // 空了
            while (list.size()==0) {
                try {
                    list.wait();
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            // 不空
            list.remove();
            list.notifyAll();
        }
    }
}

生产线程

public class Producer extends Thread {

    private Storage storage;

    public Producer(Storage storage){
        this.storage = storage;
    }

    @Override
    public void run(){
        storage.produce();
    }
}

消费线程

public class Consumer extends Thread {

    private Storage storage;

    public Consumer(Storage storage) {
        this.storage = storage;
    }

    @Override
    public void run() {
        storage.consume();
    }
}

关键点注释

模型由3部分构成:缓冲区、生产线程、消费线程。其中最关键的是缓冲区的编写。

由于频繁做add/remove操作,所以应该使用链式存储的LinkedList、LinkedHashMap等结构。

生产方法和消费方法结构差不多,记住1个也就记住了另1个。

  1. 临界区为整个方法;
  2. while(条件变量),条件变量是缓冲区满了或空了;
  3. while中wait()交出CPU资源;
  4. while后执行add/remove操作;
  5. notifyAll()唤醒所有等待线程。