5 Java并发死锁

作者: 笑Skr人啊 | 来源:发表于2017-08-31 10:43 被阅读12次

    死锁描述了两个或多个线程等待彼此而被永久阻塞的情况。 当多个线程需要相同的锁定但以不同的顺序获取时,会发生死锁。 Java多线程程序可能会遇到死锁状况,因为synchronized关键字会导致执行线程在等待与指定对象相关联的锁定或监视时出现阻止情况。 看看下面一个例子。

    示例

    package ThreadMethod;
    
    public class DeadLock {
        public static Object Lock1 = new Object();
        public static Object Lock2 = new Object();
    
        public static void main(String args[]) {
            ThreadDemo1 T1 = new ThreadDemo1();
            ThreadDemo2 T2 = new ThreadDemo2();
            T1.start();
            T2.start();
        }
    
        private static class ThreadDemo1 extends Thread {
            public void run() {
                synchronized (Lock1) {
                    System.out.println("Thread 1: Holding lock 1...");
    
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                    }
                    System.out.println("Thread 1: Waiting for lock 2...");
    
                    synchronized (Lock2) {
                        System.out.println("Thread 1: Holding lock 1 & 2...");
                    }
                }
            }
        }
    
        private static class ThreadDemo2 extends Thread {
            public void run() {
                synchronized (Lock2) {
                    System.out.println("Thread 2: Holding lock 2...");
    
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                    }
                    System.out.println("Thread 2: Waiting for lock 1...");
    
                    synchronized (Lock1) {
                        System.out.println("Thread 2: Holding lock 1 & 2...");
                    }
                }
            }
        }
    }
    

    当您编译并执行上述程序时,会出现死锁情况,以下是程序生成的输出 -

    Thread 1: Holding lock 1...
    Thread 2: Holding lock 2...
    Thread 1: Waiting for lock 2...
    Thread 2: Waiting for lock 1...
    

    上述程序将永久挂起,因为两个线程都不能继续进行,等待彼此释放锁定。

    死锁解决方案示例

    下面我们修改锁的顺序并运行相同的程序,看看这两个线程是否仍然相互等待 -

    实例

    package ThreadMethodSolve;
    
    public class DeadLock {
        public static Object Lock1 = new Object();
        public static Object Lock2 = new Object();
    
        public static void main(String args[]) {
            ThreadDemo1 T1 = new ThreadDemo1();
            ThreadDemo2 T2 = new ThreadDemo2();
            T1.start();
            T2.start();
        }
    
        private static class ThreadDemo1 extends Thread {
            public void run() {
                synchronized (Lock1) {
                    System.out.println("Thread 1: Holding lock 1...");
    
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                    }
                    System.out.println("Thread 1: Waiting for lock 2...");
    
                    synchronized (Lock2) {
                        System.out.println("Thread 1: Holding lock 1 & 2...");
                    }
                }
            }
        }
    
        private static class ThreadDemo2 extends Thread {
            public void run() {
                //和死锁的区别只是修改了锁的顺序
                synchronized (Lock1) {
                    System.out.println("Thread 2: Holding lock 1...");
    
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                    }
                    System.out.println("Thread 2: Waiting for lock 2...");
    
                    synchronized (Lock2) {
                        System.out.println("Thread 2: Holding lock 1 & 2...");
                    }
                }
            }
        }
    }
    
    

    运行

    Thread 1: Holding lock 1...
    Thread 1: Waiting for lock 2...
    Thread 1: Holding lock 1 & 2...
    Thread 2: Holding lock 1...
    Thread 2: Waiting for lock 2...
    Thread 2: Holding lock 1 & 2...
    

    相关文章

      网友评论

        本文标题:5 Java并发死锁

        本文链接:https://www.haomeiwen.com/subject/bptqjxtx.html