• jdk线程的死锁


    两个线程相互等着对方释放同步监听器;等着要对方的结果后才能继续执行就会发生死锁。

    男对女说:你先嫁给我,我再给你买房子;女对男说:你先给我买房子,我再嫁给你。

    多个线程同时锁住同一个监听对象

    在开发中要避免死锁。

    死锁的例子:

    public class DeadLock {
        public static void main(String[] args) {
            Resource r1 = new Resource();
            Resource r2 = new Resource();
            
            // 每个线程都拥有r1,r2两个对象
            Thread myTh1 = new MyThread1(r1, r2);
            Thread myTh2 = new MyThread2(r1, r2);
            
            myTh1.start();
            myTh2.start();
        }
    }
    
    class Resource {
        private int i;
    }
    
    class MyThread1 extends Thread {
        private Resource r1, r2;
    
        public MyThread1(Resource r1, Resource r2) {
            this.r1 = r1;
            this.r2 = r2;
        }
    
        @Override
        public void run() {
            while (true) {
                // 先获得r1的锁,再获得r2的锁
                synchronized (r1) {
                    System.out.println("1号线程获取了r1的锁");
                    synchronized (r2) {
                        System.out.println("1号线程获取了r2的锁");
                    }
                }
            }
        }
    }
    
    class MyThread2 extends Thread {
        private Resource r1, r2;
    
        public MyThread2(Resource r1, Resource r2) {
            this.r1 = r1;
            this.r2 = r2;
        }
    
        @Override
        public void run() {
            while (true) {
                // 先获得r2的锁,再获得r1的锁
                synchronized (r2) {
                    System.out.println("2号线程获取了r2的锁");
                    synchronized (r1) {
                        System.out.println("2号线程获取了r1的锁");
                    }
                }
            }
        }
    }
  • 相关阅读:
    RSA 与 DSA
    atlassian
    Cygwin
    windows下编写的Shell脚本在Linux下运行错误的解决方法
    NSKeyValueObserving(KVO)
    UIBezierPath 的使用介绍
    Objective
    Objective-C 内存管理原则
    Mac OSX 快捷键&命令行总览
    浅析Objective-C字面量
  • 原文地址:https://www.cnblogs.com/luogankun/p/3991391.html
Copyright © 2020-2023  润新知