线程死锁的后果:
被锁住的所有线程一直卡在那里,既不释放又不执行完。
发生线程死锁的条件:
- 多线程同时执行
- 至少两把锁
- A方法中锁的顺序与B方法中的锁的顺序不同
举个栗子:
public class LockDemo{
/**
* 两把锁
*/
private static final Object SYNCHRONIZED_OBJECTA = new Object();
private static final Object SYNCHRONIZED_OBJECTB = new Object();
public void DeadLockMethod1() {
synchronized (SYNCHRONIZED_OBJECTA) {
System.out.println("method1-1");
synchronized (SYNCHRONIZED_OBJECTB) {
System.out.println("method1-2");
}
}
}
public void DeadLockMethod2() {
synchronized (SYNCHRONIZED_OBJECTB) {
System.out.println("method2-1");
synchronized (SYNCHRONIZED_OBJECTA) {
System.out.println("method2-2");
}
}
}
@Test
public void DeadLockDemo() {
LockDemo lockDemo = new LockDemo();
DeadThreadDemo deadThreadDemo1 = new DeadThreadDemo(lockDemo, "method1");
DeadThreadDemo deadThreadDemo2 = new DeadThreadDemo(lockDemo, "method2");
deadThreadDemo1.start();
deadThreadDemo2.start();
try {
deadThreadDemo1.join();
deadThreadDemo2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class DeadThreadDemo extends Thread {
LockDemo lockDemo;
String method;
DeadThreadDemo(LockDemo lockDemo,String method) {
this.lockDemo = lockDemo;
this.method = method;
}
@Override
public void run() {
if (method.equals("method1")) {
lockDemo.DeadLockMethod1();
} else {
lockDemo.DeadLockMethod2();
}
}
}
执行结果:
如果没有发生死锁(太快结束),多试几次