• 模拟死锁


    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();
    
        }
    
    }
  • 相关阅读:
    link和@import的区别
    行内元素、块状元素和行内块元素
    content-box与border-box区别
    实现浏览器内多个标签页之间的通信
    cookie、 sessionStorage 、localStorage之间的区别和使用
    让浏览器识别HTML5规范中的新标签
    HTML5新增及移除的元素
    摇一摇
    WebViewJavascriptBridge
    使用TFHpple解析html
  • 原文地址:https://www.cnblogs.com/zj0208/p/9112500.html
Copyright © 2020-2023  润新知