并发编程学习总结(八) :java中synchronized关键字使用详解 对象锁的相关条件的使用(2)

上一篇博客中主要学习了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()方法是的消费者线程进入该条件的等待集中。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值