黑马程序员技术交流社区
标题:
求解惑
[打印本页]
作者:
那些人之一
时间:
2013-12-8 19:24
标题:
求解惑
本帖最后由 那些人之一 于 2013-12-9 09:10 编辑
问题1:两个线程,想让一个有全部两个钥匙,一个就只有一个。所以就把毕老师的死锁问题给修该了,但是看结果没有弄明白为什么会出现这个结果。求解惑。
问题2:如何实现一个有全部两个钥匙,一个就只有一个。下面代码,和结果的截图。
class Test implements Runnable
{
private boolean flag;
Test(boolean flag)
{
this.flag=flag;
}
public void run()
{
if(flag)
{
//while(true)
synchronized(Mylock.locka)
{
System.out.println(Thread.currentThread().getName()+
"if ----locka----");
synchronized(Mylock.lockb)
{
System.out.println(Thread.currentThread().getName()+
"if ----lockb----");
}
}
}
else
{
//while(true)
synchronized(Mylock.lockb)
{
System.out.println(Thread.currentThread().getName()+
"else ----lockb----");
if(flag=true)
{
synchronized(Mylock.lockb)
{
System.out.println(Thread.currentThread().getName()+
"else----lockb----");
}
}
else
{
synchronized(Mylock.locka)
{
System.out.println(Thread.currentThread().getName()+
"else----locka----");
}
}
/*synchronized(Mylock.locka)
{
System.out.println(Thread.currentThread().getName()+
"else----locka----");
}
*/
}
}
}
}
class Mylock
{
public static final Object locka=new Object();
public static final Object lockb=new Object();
}
class Dead
{
public static void main(String[] args)
{
Test a=new Test(true);
Test b=new Test(false);
Thread t1=new Thread(a);
Thread t2=new Thread(b);
t1.start();
t2.start();
}
}
复制代码
360截图20131208192401328.jpg
(27.55 KB, 下载次数: 43)
下载附件
2013-12-8 19:24 上传
作者:
lichao
时间:
2013-12-8 20:11
问题一:
源代码:
class Test implements Runnable
{
private boolean flag;
Test(boolean flag)
{
this.flag=flag;
}
public void run()
{
if(flag)
{
//while(true) //因为将while注释掉线程只运行一次,如果能出现死锁,死锁出现的情况也非常难弄出来
synchronized(Mylock.locka) //获得锁 locka
{
System.out.println(Thread.currentThread().getName()+
"if ----locka----");
synchronized(Mylock.lockb)//获得锁 lockb
{
System.out.println(Thread.currentThread().getName()+
"if ----lockb----");
}
}
}
else
{
//while(true)//将while 注释点线程只运行一次
synchronized(Mylock.lockb) //获得锁lockb
{
System.out.println(Thread.currentThread().getName()+
"else ----lockb----");
if(flag=true)//因为词句为赋值语句,而值为true,所以不管运行几次都不会运行else语句。
{
synchronized(Mylock.lockb)//获得锁lockb
{
System.out.println(Thread.currentThread().getName()+
"else----lockb----");
}
}
else
{
synchronized(Mylock.locka)
{
System.out.println(Thread.currentThread().getName()+
"else----locka----");
}
}
/*synchronized(Mylock.locka)
{
System.out.println(Thread.currentThread().getName()+
"else----locka----");
}
*/
}
}
}
}
class Mylock
{
public static final Object locka=new Object();
public static final Object lockb=new Object();
}
class Dead
{
public static void main(String[] args)
{
Test a=new Test(true);
Test b=new Test(false);
Thread t1=new Thread(a);
Thread t2=new Thread(b);
t1.start();
t2.start();
}
}
复制代码
如果t1先执行获得locka的锁,对t2没有影响,如果t1继续获得lockb 那么t2就会等待等到t1运行结束,t2在运行;如果t2获得lockb锁那么在t2运行完之前t1等待.
如果t2先获得锁lockb,对t1获得锁locka没有影响,对于t1获得锁locka对t2没有影响,但t1想获得lockb锁,要等到t2运行完;
所以不出现死锁。
所以出现的结果是固定的几种。
问题二:
一个有全部两个钥匙,一个就只有一个,是不可能死锁的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2