发什么出现死锁

不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。

举个例子:假如业务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();
    }
}