黑马程序员技术交流社区
标题:
关于死锁的问题,有人能回答出这个问题吗,哪一个是死锁
[打印本页]
作者:
覃勇
时间:
2013-5-3 14:04
标题:
关于死锁的问题,有人能回答出这个问题吗,哪一个是死锁
/*
所谓死锁就是在一个锁中嵌套另外一个锁,两个线程持有各自的锁,但都需要到对方的锁里面去运行
*/
class Ticket implements Runnable
{
private int Ticket = 100;
boolean flag = true;
Object obj = new Object();
public void run()
{
if(flag)
{
while(true)
{
synchronized(obj) //一定要注意同步锁添加在那个地方加
{
show();
}
}
}
else
{
while(true)
show();
}
}
public synchronized void show()
{
synchronized(obj) //一定要注意同步锁添加在那个地方加
{
if(Ticket>0)
{
//try{Thread.sleep(10);}catch (Exception e){}
System.out.println(Thread.currentThread().getName()+"----"+(Ticket--));
}
}
}
}
class DeadLockDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread d1 = new Thread(t);
Thread d2 = new Thread(t);
d1.start();
try{Thread.sleep(10);}catch (Exception e){}
t.flag = false;
d2.start();
}
}
复制代码
/*
==================上面是死锁还是下面是死锁,说出理由=========================
*/
class Ticket implements Runnable
{
private int Ticket = 30000;
boolean flag = true;
Object obj = new Object();
public void run()
{
if(flag)
{
while(true)
{
synchronized(obj) //一定要注意同步锁添加在那个地方加
{
show();
}
}
}
else
{
show();
}
}
public synchronized void show()
{
while(true){
synchronized(obj) //一定要注意同步锁添加在那个地方加
{
if(Ticket>0)
{
//try{Thread.sleep(10);}catch (Exception e){}
System.out.println(Thread.currentThread().getName()+"----"+(Ticket--));
}
}
}
}
}
class DeadLockDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread d1 = new Thread(t);
Thread d2 = new Thread(t);
d1.start();
try{Thread.sleep(10);}catch (Exception e){}
t.flag = false;
d2.start();
}
}
复制代码
作者:
覃勇
时间:
2013-5-3 14:05
首先说下这两个程序的区别,主要是把while(true)放的位置不相同
作者:
殇_心。
时间:
2013-5-3 15:10
本帖最后由 殇_心。 于 2013-5-3 15:11 编辑
这个位置不一样。结果大不一样了。
第一个出现死锁原因:2个线程抢。
而第二个不是死锁的原因:你run方法里面调用的show函数。
(注意没有用while(true)),也就调用一次。
也就是说如果线程只运行show一次,run方法就结束了。
也就是说线程就结束了。不存在争抢的条件。
所以第二个是不会出现死锁情况的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2