java一段死锁的代码
程序员文章站
2022-07-15 15:26:40
...
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
public class ShareObject1 {}
public class ShareObject2 {}
public class Thread1 extends Thread {
@Override
public void run() {
synchronized (ShareObject1.class) {
System.out.println("线程1获取到 ShareObject1 的锁");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (ShareObject2.class) {
System.out.println("线程1获取到 ShareObject2 的锁");
}
}
}
}
public class Thread2 extends Thread {
@Override
public void run() {
synchronized (ShareObject2.class) {
System.out.println("线程2获取到 ShareObject2 的锁");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (ShareObject1.class) {
System.out.println("线程2获取到 ShareObject1 的锁");
}
}
}
}
public class Test {
public static void main(String[] args) {
new Thread1().start();
new Thread2().start();
}
}
运行main得到如下结果:
在上述代码中,线程Thread1首先获取到ShareObjectl的锁,然后再去尝试获取ShareObject2的锁:此时线程Thread2已经获取到ShareObject2的锁,继续尝试去获取ShareObject1的锁。这样两个线程都需要得到对方已经占有的资源后才能继续运行,因此,会导致死锁。造成死锁的主要原因是两个线程请求资源的顺序不合理,如果这两个线程采用同样的顺序获取,那么就不会出现死锁。
参考文献:《Java程序员面试笔试真题与解析》
上一篇: 以小见大,一段简单的多线程代码
下一篇: 什么是内部类?