欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java并发编程之Condition

程序员文章站 2024-03-12 12:38:50
...

在Java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait()wait(long timeout)notify()notifyAll(),这些方法配合synchronized关键字一起使用可以实现等待/通知模式。

同样,Condition接口也提供了类似Object监视器的方法,通过与Lock配合来实现等待/通知模式。

为了更好的了解Condition的特性,我们来对比一下两者的使用方式以及功能特性:


Java并发编程之Condition

Java并发编程之Condition

public class ThreadTest15 {
    public static void main(String[] args) {
        final Math math = new Math();
        for (int i = 0; i < 10; i++) {
            new Thread(() -> math.increase()).start();

            new Thread(() -> math.decrease()).start();
        }
    }
}

class Math {
    private int num;
    private Lock lock = new ReentrantLock();// 锁对象
    private Condition condition = lock.newCondition();

    public void increase() {
        lock.lock();
        try {
            while (num != 0) {
                try {
                    condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            num++;
            condition.signalAll();// 唤醒阻塞队列的某线程到就绪队列
            System.out.println(Thread.currentThread().getName() + ":increase-->[" + num + "]");
        } finally {
            lock.unlock();
        }
    }

    public void decrease() {
        lock.lock();
        try {
            while (num == 0) {
                try {
                    condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            num--;
            condition.signalAll();// 唤醒阻塞队列的某线程到就绪队列
            System.out.println(Thread.currentThread().getName() + ":decrease-->{" + num + "}");
        } finally {
            lock.unlock();
        }
    }

}