上一篇博客中主要学习了synchronized关键字使用对象锁和类锁 已经对象锁的一些简单特性。这篇文章中我们主要来学习一下对象锁的相关条件的使用。
我们知道显示锁ReentrantLock 有一个或多个相关的条件对象,而对象锁只有一个相关条件。
wait()方法添加一个线程到该条件的等待集中
notifyAll()/notity()方法解除等待线程的阻塞状态
当我们调用对象的相关条件的wait()/notifyAll()方法时,等价于调用显示锁lock的
lock.await()/lock.signalAll()方法。
下面我们直接使用对象锁的相关条件实现一个生产者和消费者案例,大家可以与我的另一篇博客对比并发编程学习总结(五) :java 显式锁ReentrantLock使用详解之条件对象(2)
public class SynchronizedTest3 {
private Object object = new Object();
private List<Integer> list = new ArrayList<Integer>();
private boolean flag = true;
// 这里我们使用object对象的锁,以及该锁的条件对象
// 生产者线程一次生产一个数据5
public void produce() throws InterruptedException {
synchronized(object) {
while(flag){
if (list.size() > 0){
object.wait();
} else {
list.add(5);
System.out.println("生产者生产数据");
object.notifyAll();
}
}
}
}
// 消费者线程每次消费一个数据
public void consume() throws InterruptedException {
synchronized(object){
while(flag){
if (list.size() <= 0) {
object.wait();
} else {
System.out.println(list.remove(0));
System.out.println("消费者消费数据");
object.notifyAll();
}
}
}
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
final SynchronizedTest3 test = new SynchronizedTest3();
Thread t1 = new Thread(new Runnable() {
public void run() {
try {
test.produce();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
try {
test.consume();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
t1.start();
t2.start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
test.setFlag(false);
}
}
以上代码中我们使用的是Object object对象的锁及其相关条件来实现生产者和消费者模型案例。
生产者线程检查容器list中是否有数据,如果有数据则调用object.wait()使得生产者线程进入该条件的等待集中,如果容器中没有数据,则生产者线程生产数据放入list中,让后调用object.notifyAll()方法从该条件等待集中所有线程的阻塞状态。
消费者线程检查容器中是否有数据,如果有数据则消费数据然后调用notifyAll()方法,是的处于该条件等待集中的生产者线程解除阻塞状态。如果没有数据调用object.wait()方法是的消费者线程进入该条件的等待集中。