美文网首页
Lock+condition+await+signalAll实现

Lock+condition+await+signalAll实现

作者: Cool尘 | 来源:发表于2021-12-09 11:39 被阅读0次

实现

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 生产者消费者模式:利用Lock、Condition、await、signalAll
 *
 * @date 2021/12/9 9:27
 */
public class LockResource {

    public static void main(String[] args) {
        LockResource resource = new LockResource();
        LockProducer producer = new LockProducer(resource);
        LockConsumer consumer = new LockConsumer(resource);

        new Thread(producer).start();
        new Thread(consumer).start();
    }

    private int num = 0;

    // 创建锁对象
    Lock lock = new ReentrantLock();

    // 创建条件对象
    Condition condition = lock.newCondition();

    public void produce() {
        try {
            // 开启锁
            lock.lock();
            // 防止虚假唤醒,采用while的方式进行判断
            while (num >= 10) {
                try {
                    condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            num++;
            System.out.println("生产者 - < " + Thread.currentThread().getName() + " >, 当前资源数量为:" + num);
            // 生产完一个数据之后,就唤醒等待的消费者线程进行消费
            condition.signalAll();
        } finally {
            // 释放锁
            lock.unlock();
        }
    }

    public void consume() {
        try {
            lock.lock();
            while (num <= 0) {
                try {
                    condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            num--;
            System.out.println("消费者 - < " + Thread.currentThread().getName() + " >, 当前资源数量为:" + num);
            condition.signalAll();
        } finally {
            lock.unlock();
        }
    }
}

class LockProducer implements Runnable {

    LockResource resource;

    public LockProducer(LockResource resource) {
        this.resource = resource;
    }

    @Override
    public void run() {
        while (true) {
            resource.produce();
        }
    }
}

class LockConsumer implements Runnable {

    LockResource resource;

    public LockConsumer(LockResource resource) {
        this.resource = resource;
    }

    @Override
    public void run() {
        while (true) {
            resource.consume();
        }
    }
}

相关文章

网友评论

      本文标题:Lock+condition+await+signalAll实现

      本文链接:https://www.haomeiwen.com/subject/dpkffrtx.html