买票程序的死锁的产生于解决

package tickets;

public class Tickets implements Runnable
{
	static int tickets = 100;
	Object o = new Object();
	boolean isSell = false;
	boolean ouse;//对象o锁定标志
	boolean tuse;//对象this锁定标志
	public void run()
	{
		// TODO Auto-generated method stub

		if(!isSell)
		{
			while(true)
			{
				if(!ouse&&!tuse)
				{
					try
					{
						Thread.sleep(1);
					} catch (InterruptedException e)
					{
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					ouse = true;
					tuse = true;				
					synchronized(o)
					{
						synchronized(this)
						{
							Thread.yield();
							if(tickets>0)
							{
								try
								{
									Thread.sleep(1);
								} catch (InterruptedException e)
								{
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
								System.out.println(Thread.currentThread().getName()+"卖出了第"+tickets+"张票");
								tickets--;
							}
							else
							{
								break;
							}						
						}
						ouse = false;
						tuse = false;
						Thread.yield();
					}
				}
			}
		}
		else
		{
			while(true)
			{
				if(!ouse&&!tuse)
				{try
				{
					Thread.sleep(1);
				} catch (InterruptedException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
					ouse = true;
					tuse = true;

					if(!sell())
					{
						break;
					}
					else
					{
						Thread.yield();
					}
				}
			}
		}
	}
	
	public synchronized boolean sell()
	{
		try
		{
			Thread.sleep(10);
		} catch (InterruptedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		synchronized(o)
		{
			Thread.yield();
			if(tickets>0)
			{
				try
				{
					Thread.sleep(10);
				} catch (InterruptedException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName()+"用sell()卖出了第"+tickets+"张票");
				tickets--;
				ouse = false;
				tuse = false;
				return true;
			}		
			else
			{
				ouse = false;
				tuse = false;
				return false;
			}
		}
		

	}
	
}

 

package tickets;

public class TicketsTest
{
	
	public static void main(String[] args)
	{
		Tickets t = new Tickets();
		new Thread(t,"一号窗口").start();
		try
		{
			Thread.sleep(1);
		} catch (InterruptedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		t.isSell = true;
		new Thread(t,"二号窗口").start();
//		new Thread(t,"三号窗口").start();
//		new Thread(t,"四号窗口").start();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值