模拟死锁

Posted 迷失之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟死锁相关的知识,希望对你有一定的参考价值。

public class A {

    public void a() {
        System.out.println(Thread.currentThread().getName() + " in a.");
    }

}

 

public class B {

    public void b() {
        System.out.println(Thread.currentThread().getName() + " in b.");
    }

}

 

/**
 * 模拟死锁
 */
public class TestDeadLock {

    /*
     * 死锁的解决办法:
     * 对象的加锁顺序一定要一致,比如都是先加a的锁,后加b的锁.
     */

    public static void main(String[] args) {

        // 两个对象
        A a = new A();
        B b = new B();

        /*
         * a和b的方法必须同步执行(例如A账户转账给B账户)
         * 所以a和b的方法执行之前,要要对a对象和b对象都加锁
         * 
         * 模拟:
         * 线程1先给a加锁,给b加锁的时候失败,等待线程2释放b的锁。
         * 线程2先给b加锁,给a加锁的时候失败,等待线程1释放a的锁。
         */

        // 线程1
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 先锁a
                synchronized (a) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    // 1s后去锁b
                    synchronized (b) {
                        a.a();
                        b.b();
                    }
                }

                System.out.println(Thread.currentThread().getName() + " done.");
            }
        }).start();

        // 线程2
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 先锁b
                synchronized (b) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    // 1s后去锁a
                    synchronized (a) {
                        b.b();
                        a.a();
                    }

                }

                System.out.println(Thread.currentThread().getName() + " done.");
            }
        }).start();

    }

}

 

以上是关于模拟死锁的主要内容,如果未能解决你的问题,请参考以下文章

使用单个客户端和单个会话模拟 SQL Server 上的死锁

sqlserver-处理死锁

一篇文全面解析Oracle死锁的分类及模拟

什么是死锁?

锁Oracle死锁(DeadLock)的分类及其模拟

死锁模拟