切符を買うプログラムのデッドロックの発生は解決します

3368 ワード

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();
	}
}