线程中买家卖家解决死锁问题

普通线程买家与卖家之间的交互

public class Buyer implements Runnable{
          
   
	private Phone phone;
		
	public Buyer(Phone phone) {
          
   
		super();
		this.phone = phone;
	}

	@Override
	public void run() {
          
   
		for (int i = 0; i < 20; i++) {
          
   
			phone.buyer();
		}
		
	}

}
public class Salary implements Runnable{
          
   
	private Phone phone;
	
	public Salary(Phone phone) {
          
   
		super();
		this.phone = phone;
	}

	@Override
	public void run() {
          
   
		for (int i = 0; i < 20; i++) {
          
   
			if(i%2==0){
          
   
				phone.salary("品牌的手机");
			}else {
          
   
				phone.salary("杂牌子的手机");
			}
		}	
	}	
}
public class Phone {
          
   
		private String phoneName;
		
		public void salary(String phoneName){
          
   
			System.out.println("商家拿出: "+phoneName);
			this.phoneName=phoneName;	
		}
		
		public void buyer() {
          
   
			System.out.println("买家拿出:"+ this.phoneName +" 的钱");
		}	
}
public class Main {
          
   

	public static void main(String[] args) {
          
   
		Phone phone=new Phone();
		Buyer buyer=new Buyer(phone);
		Salary salary=new Salary(phone);
		Thread threadBuyer=new Thread(buyer);
		Thread threadSalary=new Thread(salary);
		threadBuyer.start();
		threadSalary.start();

	}

}

使用同步锁和信号灯

public class Phone {
          
   
	private String phoneName;

	boolean bool = true;//信号灯 bool

	public synchronized void salary(String phoneName) {
          
   
		if (!bool) {
          
   //先进来不执行,让商家先拿出手机
			try {
          
   
				this.wait();
			} catch (InterruptedException e) {
          
   
				e.printStackTrace();
			}
		}
		System.out.println("商家拿出: " + phoneName);
		this.phoneName = phoneName;
		bool = false;//赋值false,表示当前商家已经拿出手机,唤醒买家
		this.notify();//将当前对象唤醒
	}

	public synchronized void buyer() {
          
   
		if (bool) {
          
   //当商家还没拿出手机先进入等待,睡眠
			try {
          
   
				this.wait();
			} catch (InterruptedException e) {
          
   
				e.printStackTrace();
			}
		}
		System.out.println("买家拿出:" + this.phoneName + "的钱");
		bool=true;//赋值true,表示当前买家已经拿出钱,唤醒卖家
		this.notify();
	}
}
经验分享 程序员 微信小程序 职场和发展