zoukankan      html  css  js  c++  java
  • 12_死锁问题

    【死锁例子】

    public class Demo {
        public static void main(String[] args) {
            DeadLockThread dt1=new DeadLockThread(true);
            DeadLockThread dt2=new DeadLockThread(false);
            
            Thread t1=new Thread(dt1,"筷子线程");
            Thread t2=new Thread(dt2,"刀叉线程");
            
            t1.start();
            t2.start();
        }
    }
    
    class DeadLockThread implements Runnable{
    
        static Object chopsticks=new Object();  //筷子
        static Object knifeFork=new Object();   //刀叉
        private boolean flag;
        
        public DeadLockThread(boolean flag){
            this.flag=flag;
        }
        
        @Override
        public void run() {
            if(flag){   //如果为true,默认为筷子线程
                while(true){
                    synchronized (chopsticks) {  
                        System.out.println(Thread.currentThread().getName()+"---if---chopsticks");
                        synchronized (knifeFork) {   //等待刀叉线程的锁释放
                            System.out.println(Thread.currentThread().getName()+"---if---knifefork");
                        }
                    }
                }
            }else{    //如果为false,默认为刀叉线程
                while(true){
                    synchronized (knifeFork) {
                        System.out.println(Thread.currentThread().getName()+"---else---knifefork");
                        synchronized (chopsticks) {  //等待筷子线程的锁释放
                            System.out.println(Thread.currentThread().getName()+"---else---chopsticks");
                        }
                    }
                }
            }
        }
    }

    【运行结果】

    【分析】

    创建两个线程"筷子线程"和"刀叉线程",flag值分别为true和false,分别执行run方法中的if和else的代码块,注意chopstickknifefork对象锁都是静态变量,所以两个线程中的static变量时一致的。当筷子线程拥有chopsticks锁,此时需要获得knifefork锁才能继续执行,而刀叉线程拥有knifefork锁,此时需要chopsticks锁才能继续执行,此时就陷入了一个矛盾,两个线程都需要对方占用的锁,但是都无法释放自己的锁,于是两个线程都处于了挂起状态,造成上面的死锁现象。

  • 相关阅读:
    在独立的文件里定义WPF资源
    Irrlicht 3D Engine 笔记系列 之 教程6- 2D Graphics
    Java实现二叉树的创建、递归/非递归遍历
    NDK在windows下的开发环境搭建及开发过程
    硬件路由转发原理浅析
    ubuntu下vim中内容拷贝到浏览器
    python调用Java代码,完毕JBPM工作流application
    C++组合通信
    linux杂谈(十八):DNSserver的配置(一)
    Codeforces 550D. Regular Bridge 构造
  • 原文地址:https://www.cnblogs.com/HigginCui/p/6136686.html
Copyright © 2011-2022 走看看