进程锁改进版

package thread_communication;

import java.util.concurrent.locks.*;

/*
 * 
 * notify之后和正常线程一样有资格竞争执行权;
 * 
 * 新特性:1.5之后
 *  隐式的synchronized--->显式的lock.lock();lock.unlock();
 * wait,notify--->显式的等待唤醒condition.await();condition.singal();
 * 
 * 一个锁lock可以有好几个不同的await singal分别进行等待唤醒,替代了嵌套同步可能造成的死锁问题;
 * 
 * 实现了本方只唤醒对方的操作
 * 
 * 释放锁的操作一定要执行;
 * 
 * */

class Resource{
	private String name;
	private int num=1;
	private boolean mark=false;
	private Lock lock=new ReentrantLock();//lock接口
	private Condition condition_1=lock.newCondition();//利用不同的锁条件进行等待和启用;
	private Condition condition_2=lock.newCondition();//条件2
	public  void pro(String name)throws InterruptedException
	{
		lock.lock();
		try{
		while(mark)//保证不会生产两次消费一次
			condition_1.await();
		
		this.name=name+"  ,"+num++;
		System.out.println(Thread.currentThread().getName()+"                   produce comodity: "+this.name);
		mark=true;
		condition_2.signalAll();
		}
		finally{
			lock.unlock();//抛出异常也必须要把锁给释放掉;释放锁的操作一定要执行;
		}
		
	}
	
	public  void print()throws InterruptedException{
		lock.lock();
		try{
			while(!mark)//保证不会消费两次生产一次
				condition_2.await();
	
				System.out.println(Thread.currentThread().getName()+"consume comodity: "+name);
				mark=false;
				condition_1.signalAll();
		}
		finally{
			lock.unlock();//抛出异常也必须要把锁给释放掉;释放锁的操作一定要执行;
		}
		
	}
	
}

class producer implements Runnable{
	Resource r;
	producer(Resource r){
		this.r=r;
	}
	
	public void run(){
		while(true){
			try{
				r.pro("bag");	
			}
			catch(Exception e){}
			}
	}
}

class consumer implements Runnable{
	Resource r;
	consumer(Resource r){
		this.r=r;
		
	}
	
	public void run(){
		while(true){
			try{
			r.print();
			}
			catch(Exception e){}
			
		}
	}
}


public class Producer_Customer {

	public static void main(String[] args) {
		Resource rr=new Resource();
		consumer c=new consumer(rr);
		producer p=new producer(rr);

		Thread t1=new Thread(c);	
		Thread t2=new Thread(c);
		Thread t3=new Thread(p);
		Thread t4=new Thread(p);
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值