发什么出现死锁
不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。
举个例子:假如业务A模块拿到了A锁,需要拿到B锁后才能继续向下执行;另外业务B模块拿到了B锁,需要拿到A锁后才能继续向下执行。这个时候,如果它们都拿着手中的锁不放,指望对方释放锁的话,就会一直僵持下去,形成死锁。
出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续向下执行。
下面来演示下死锁的诞生
class Dead1 implements Runnable
{
@Override
public void run() {
synchronized (Dead1.class) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("a");
synchronized (Dead2.class) {
System.out.println("b");
}
}
}
}
class Dead2 implements Runnable
{
@Override
public void run() {
synchronized (Dead2.class) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1");
synchronized (Dead1.class) {
System.out.println("2");
}
}
}
}
public class DeadLock {
public static void main(String[] args) {
Dead1 dead1 = new Dead1();
Dead2 dead2 = new Dead2();
Thread thread1 = new Thread(dead1);
Thread thread2 = new Thread(dead2);
thread1.start();
thread2.start();
}
}