码迷,mamicode.com
首页 > 其他好文 > 详细

模拟死锁

时间:2018-05-30 19:13:23      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:get   string   必须   syn   方法   runnable   rup   static   override   

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();

    }

}

 

模拟死锁

标签:get   string   必须   syn   方法   runnable   rup   static   override   

原文地址:https://www.cnblogs.com/zj0208/p/9112500.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!