黑马程序员技术交流社区
标题:
关于死锁程序的疑问
[打印本页]
作者:
王利强
时间:
2012-3-14 16:18
标题:
关于死锁程序的疑问
不多说,先上代码,有几点疑问,当我将if语句写为if(flag)或if(flag==true)时,运行结果均为if locka与else lockb,即发生死锁。而当我将if语句写为if(flag=true)时,运行结果却为if locka ; if lockb;if locka;if lockb,这是为什么呢?
class test implements Runnable
{ private boolean flag;
test(boolean flag)
{
this.flag=flag;
}
public void run()
{
if(flag==true)
{
synchronized(lock.locka)
{ System.out.println("if locka");
synchronized(lock.lockb)
{
System.out.println("if lockb");
}
}
}
else
{synchronized(lock.lockb)
{ System.out.println("else lockb");
synchronized(lock.locka)
{
System.out.println("else locka");
}
}
}
}
}
class lock
{ static Object locka=new Object();
static Object lockb=new Object();
}
class DeathDemo
{
public static void main(String[] args)
{
Thread t1=new Thread(new test(true));
Thread t2=new Thread(new test(false));
t1.start();
t2.start();
}
}
作者:
泮和顺
时间:
2012-3-14 18:12
死锁也有水产的情况所以输出结果不一样
作者:
贠(yun)靖
时间:
2012-3-14 18:28
class test implements Runnable
{ private boolean flag;
test(boolean flag)
{
this.flag=flag;
}
public void run()
{
if(flag==true) // 初始化Test的时候给flag赋值了 1--true 2---false 启动线程 调用run方法 假设1线程执行到这句了,判断flag==true 结果范围true那么就会运行if中的语句,对吧,又假设1线程执行到if中的第一个锁中 locka就为关闭状态了,而1线程在这放弃执行权 换2线程来,false==true返回时false所以就运行else中的代码
也假设2线程执行到else里面的第一个锁里面就停止,这时候lockb 就为关闭状态,对吧。 那么现在不管执行1 还是2 线程都不能进入内层的锁了 因为都是处于关闭状态
所以你这样写也一样可以造成死锁的,至于出现逆那种情况就是不属于 我假设的这种了 才会输出不同的结果 毕竟线程是随机的啊 不可能结果都一样的
而你把flag=true 这是赋值语句 不管前面初始什么结果 最后又给flag重新赋值为true了 所以你不管怎么运行结果都一样了
{
synchronized(lock.locka)
{ System.out.println("if locka");
synchronized(lock.lockb)
{
System.out.println("if lockb");
}
}
}
else
{synchronized(lock.lockb)
{ System.out.println("else lockb");
synchronized(lock.locka)
{
System.out.println("else locka");
}
}
}
}
}
class lock
{ static Object locka=new Object();
static Object lockb=new Object();
}
class DeathDemo
{
public static void main(String[] args)
{
Thread t1=new Thread(new test(true));
Thread t2=new Thread(new test(false));
t1.start();
t2.start();
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2