黑马程序员技术交流社区
标题:
代码锁死分析:以下代码是怎么锁死?
[打印本页]
作者:
谢洋
时间:
2013-2-25 09:23
标题:
代码锁死分析:以下代码是怎么锁死?
package test1;
//代码锁死分析:以下代码是怎么锁死?
class DeadLockTest
{
public static void main(String[] args) throws InterruptedException
{
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(new Test(false));
t1.start();
t2.start();
}
}
class Test implements Runnable
{
private static boolean flag;
Test(boolean flag)
{
this.flag = flag;
}
public void run()
{
while(flag)
{
synchronized(MyLock.locka)
{
System.out.println(Thread.currentThread().getName()+"...if locka ");
synchronized(MyLock.lockb)
{
System.out.println(Thread.currentThread().getName()+"..if lockb");
}
}
flag=false;
}
while(!flag)
{
synchronized(MyLock.lockb)
{
System.out.println(Thread.currentThread().getName()+"..else lockb");
synchronized(MyLock.locka)
{
System.out.println(Thread.currentThread().getName()+".....else locka");
}
}
flag=true;
}
}
}
class MyLock
{
static Object locka = new Object();
static Object lockb = new Object();
}
作者:
胥文
时间:
2013-2-25 10:09
你的程序是正常的从上到下执行完,里面又没有循环,执行完下面的while就没了
没有你说的死循环啊
你的程序是执行完了
如果想让他们循环,就在这两个while外面在加个while(true)应该就好了
作者:
谢洋
时间:
2013-2-25 12:18
胥文 发表于 2013-2-25 10:09
你的程序是正常的从上到下执行完,里面又没有循环,执行完下面的while就没了
没有你说的死循环啊
你的程序 ...
还是不明白
我是这样想的的:
1,t1、t2共享flag标记
2,当flag为ture时,t1执行,只有待到t1把flag改为true时,t2才能执行
3,然后待t2把flag改为true后,t1又开始执行,如此循环
作者:
偏執旳、靑春
时间:
2013-2-25 13:30
这个问题我以前已接回答过多次了
假设t1先运行,t1运行到System.out.println(Thread.currentThread().getName()+"...if locka ");时。
t2又运行了,t2运行System.out.println(Thread.currentThread().getName()+"..else lockb");
因为t1没运行完,那么MyLock.locka无法释放,刚好t2需要他t2就不动了在等他,但是t1需要MyLock.lockb才能继续走,
而t2又不能给,所以二者相持不下,导致了死锁。
一直在里面等着,彼此看谁先动
作者:
宋蓬勃
时间:
2013-2-25 13:35
这个代码跟死锁没关系。
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(new Test(false));
程序运行到这里flag = fales;
t1、t2中的一个先运行,打印
...else lockb
...else locka
然后 flag = true;
该进程就结束了
另一个进程先打印
...if locka
...if lockb
flag = fales;
然后打印
...else lockb
...else locka
然后 flag = true;
该进程就结束了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2