线程死锁


    private static void deathLock() {
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                synchronized (object) {
                    System.out.println("线程1 拿了锁1");
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("线程1准备拿锁2");
                    synchronized (object2) {//由于锁2 被线程2 拿了,线程2 又在等待锁1释放,去拿,所以你不让我我不让你,造成了死锁
                        System.out.println("线程1 拿了锁2");
                        
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    System.out.println("线程1 释放了锁2");
                }
                System.out.println("线程1 释放锁1所完毕");
                
                
            }
        }).start();
        
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                System.err.println("线程2准备拿锁2");
                synchronized (object2) {
                    try {
                        System.err.println("线程2了拿锁2");
                        Thread.sleep(4000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.err.println("线程2准备拿锁1");
                    synchronized (object) {
                        System.err.println("线程2拿了锁1");
                        
                    }
                    System.err.println("线程2释放了锁1");
                    
                }
                System.out.println("线程2释放锁2");
                
                
            }
        }).start();
        
        /*
死锁日志
线程1 拿了锁1
线程2准备拿锁2
线程2了拿锁2
线程1准备拿锁2
线程2准备拿锁1

        解决方法,避免嵌套锁或者加标记判断是否持锁中。
         */
    }
image.png

我要拿你你要拿我,互不相让自己的锁,所以就出现了死锁

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容