Java并发编程之Condition
程序员文章站
2024-03-12 12:38:50
...
在Java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object
上监视器方法,包括wait()
,wait(long timeout)
,notify()
,notifyAll()
,这些方法配合synchronized
关键字一起使用可以实现等待/通知模式。
同样,Condition
接口也提供了类似Object
监视器的方法,通过与Lock
配合来实现等待/通知模式。
为了更好的了解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();
}
}
}