黑马程序员技术交流社区
标题:
关于死锁与多线程运行问题
[打印本页]
作者:
安鹏宇
时间:
2013-3-19 00:16
标题:
关于死锁与多线程运行问题
本帖最后由 安鹏宇 于 2013-3-20 20:42 编辑
<p style="line-height: 30px; text-indent: 2em;">class DeadThread {
public static String s= "t1";
public static String n="t2";//成员变量
public static void</font> main(String[] args) {
new Thread("t1"){
public void run(){
while(true)//无线循环
synchronized(s){
System.out.println(getName()+" t1");
synchronized(n){//同步锁嵌套
System.out.println(getName()+" t2o");
}
}
}
}.start();
new Thread("t2"){
public void run(){
while(true)
synchronized(n){
System.out.println(getName()+" t2o");
synchronized(s){
System.out.println(getName()+" t1");
}
}
}
}.start();
}
}
复制代码
两个线程应该是同时运行的吧?虽然死锁几率比较小,但我打印出来无限循环t1,为什么?
即使造不成死锁,t2总应该一块打印的吧?为什么无限循环t1?并且每次都是打印一次
t2就结束。。。求解。。
作者:
王洪宇
时间:
2013-3-20 18:34
我运行了一下你的代码,每次都死锁。
这段代码有三个线程,一个主线程和两个新建的线程。
主线程里面的代码按顺序执行,T1线程比T2线程先创建,所以你的运行结果前面全是T1线程里的。
如果你把T2线程的代码放到T1线程代码前面的话,运行结果会先打印一堆T2线程的内容。
按照你原代码的顺序:T1线程先创建,最先抢到CPU执行权,然后打印一堆内容,然后T1线程又一次循环,它先掌握了它的第一道锁S,但还没来得及打印(或已经打印,但没进入第二道锁),CPU执行权就被T2抢了。因为T2的第一道锁是N,刚刚T1掌握的锁是S,所以T2能抢到N这道锁。
T2线程终于抢到了锁N,打印了一句T2 T20,然后想拿到第二道锁S,但此时S锁还在T1手里拿着,所以T2无法继续执行。T2无法继续执行,就没办法释放锁N。
T1线程想向下继续执行,就需要打开第二道锁N,但此时锁N被T2掌握,所以T1也无法执行。
二者掌握着对方需要的锁不放,造成了死锁。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2