黑马程序员技术交流社区
标题:
遗留的一堆问题之--死锁
[打印本页]
作者:
马上都有
时间:
2014-5-20 15:52
标题:
遗留的一堆问题之--死锁
public class DeadLock implements Runnable {
Object locka=new Object();
Object lockb=new Object();
@Override
public void run() {
while(true){
synchronized (locka) {
System.out.println("11locka");
synchronized (lockb) {
System.out.println("11lockb");
}
}
synchronized (lockb) {
System.out.println("22lockb");
synchronized (locka) {
System.out.println("22locka");
}
}
}
}
}
public class Test {
public static void main(String[] args) {
DeadLock dk=new DeadLock();
Thread t1=new Thread(dk,"aa");
Thread t2=new Thread(dk,"bb");
t1.start();
t2.start();
}
}
这样也可以死锁,但是在while里面线程为什么可以直接去走第二个锁
复制代码
作者:
湛添友
时间:
2014-5-20 20:40
应该是第一线程去一个锁走出来了 然后进了第二个锁 然后 第二个说又进来了 进了第一个锁吧
作者:
曲佳奇
时间:
2014-5-21 08:58
稍微修改了下输出语句,为了看的直观一点
输出结果:
Thread[t1,5,main]---------|11locka
Thread[t1,5,main]---------|11lockb
Thread[t1,5,main]---------|22lockb
Thread[t2,5,main]---------|11locka
当t1线程执行完while中的
synchronized (locka) {
System.out.println(Thread.currentThread()+"---------|"+"11locka");
synchronized (lockb) {
System.out.println(Thread.currentThread()+"---------|"+"11lockb");
}
}
执行完毕后 释放了 locka 和lockb
进入了 synchronized (lockb) {
System.out.println(Thread.currentThread()+"---------|"+"22lockb");
//执行到这里时 t2线程进入while 执行的第一部分 t1持有lockb 请求locka t2持有locka 请求lockb 所以发生死锁
synchronized (locka) {
System.out.println(Thread.currentThread()+"---------|"+"22locka");
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2