黑马程序员技术交流社区
标题:
线程死锁
[打印本页]
作者:
黑马刘涛
时间:
2012-7-16 16:49
标题:
线程死锁
class TicketsSystem_deadLock
{
public static void main(String[] args)
{
//main线程开始跑,发送start消息让持有obj锁的Thread0线程就绪,
//由于中途让main线程休息了200毫秒,所以Thread0线程开始跑,
//main线程休息完200毫秒,开始让Thread1线程就绪,而后开跑,
//由于Thread0线程未跑结束,并没有释放obj锁,所以导致Thread1
//试图使用obj锁失败,从而导致同步死锁.
//简单来说就是T0,T1共用1把锁,T0还没有使用完这把锁,T1想抢锁,2个人
//就开始不跑别的事,开始互相抢锁.也就是2个人同步的时间片出现交集.
//可让main线程休息足够长时间,让T0跑完,再让T1跑.
SellThread6 st = new SellThread6();
new Thread(st).start();
try
{
Thread.sleep(200);
}
catch(Exception e)
{
e.printStackTrace();
}
st.b = true;
new Thread(st).start();
}
}
class SellThread6 implements Runnable
{
boolean b = false;
int tickets=100;
Object obj=new Object();
public void run()
{
if(b==false)
{
while(true)
{
sellTicket();
}
}
else
{
while(true)
{
synchronized(obj)
{
try
{
Thread.sleep(100);
}
catch(Exception e)
{
e.printStackTrace();
}
synchronized(this)
{
if(tickets>0)
{
System.out.println("obj:"+Thread.currentThread().getName()+" sell tickets:"+tickets);
tickets--;
}
}
}
}
}
}
public synchronized void sellTicket()
{
synchronized(obj)
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println("sell():"+Thread.currentThread().getName()+" sell tickets:"+tickets);
tickets--;
}
}
}
}
复制代码
注释为对该死锁产生原因的理解,大家可以讨论下。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2