zoukankan      html  css  js  c++  java
  • Java自学-多线程 死锁

    Java 演示多线程死锁

    当业务比较复杂,多线程应用里有可能会发生死锁

    步骤 1 : 演示死锁

    1. 线程1 首先占有对象1,接着试图占有对象2
    2. 线程2 首先占有对象2,接着试图占有对象1
    3. 线程1 等待线程2释放对象2
    4. 与此同时,线程2等待线程1释放对象1
      这样就会。。。一直等待下去

    演示死锁

    package multiplethread;
       
    import charactor.Hero;
        
    public class TestThread {
          
        public static void main(String[] args) {
            final Hero ahri = new Hero();
            ahri.name = "九尾妖狐";
            final Hero annie = new Hero();
            annie.name = "安妮";
             
            Thread t1 = new Thread(){
                public void run(){
                    //占有九尾妖狐
                    synchronized (ahri) {
                        System.out.println("t1 已占有九尾妖狐");
                        try {
                            //停顿1000毫秒,另一个线程有足够的时间占有安妮
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                         
                        System.out.println("t1 试图占有安妮");
                        System.out.println("t1 等待中 。。。。");
                        synchronized (annie) {
                            System.out.println("do something");
                        }
                    }  
                     
                }
            };
            t1.start();
            Thread t2 = new Thread(){
                public void run(){
                    //占有安妮
                    synchronized (annie) {
                        System.out.println("t2 已占有安妮");
                        try {
                             
                            //停顿1000毫秒,另一个线程有足够的时间占有暂用九尾妖狐
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        System.out.println("t2 试图占有九尾妖狐");
                        System.out.println("t2 等待中 。。。。");
                        synchronized (ahri) {
                            System.out.println("do something");
                        }
                    }  
                     
                }
            };
            t2.start();
       }
            
    }
    

    练习死锁

    3个同步对象a, b, c
    3个线程 t1,t2,t3

    故意设计场景,使这3个线程彼此死锁

    答案

    package multiplethread;
     
    public class TestThread {
           
        public static void main(String[] args) {
            Object a = new Object();
            Object b = new Object();
            Object c = new Object();
     
            Thread t1 =new Thread(){
                public void run(){
                    synchronized (a) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        synchronized (b) {
                            synchronized (c) {
                                 
                            }
                        }
                    }  
                }
            };
            Thread t2 =new Thread(){
                public void run(){
                    synchronized (c) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        synchronized (a) {
                            synchronized (b) {
                                 
                            }
                        }
                    }  
                }
            };
            Thread t3 =new Thread(){
                public void run(){
                    synchronized (b) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        synchronized (c) {
                            synchronized (a) {
                                 
                            }
                        }
                    }  
                }
            };
     
            t1.start();
            t2.start();
            t3.start();
            
       }
             
    }
    
  • 相关阅读:
    写了一个好玩的小软件, 监视鼠标以及键盘的动作, 全局钩子. HowTired
    2005的五一计划
    给你的爱一直很安静
    沉重悼念蓝色理想经典论坛原Flash版主[手工感情][Handmade]
    一不小心就成就了一段姻缘,哈哈
    基于dotnet的代码统计工具新版发布
    四天三夜 刻骨铭心 颠峰战将 永不言败
    怎么回事?现在博客园极不稳定
    屋漏偏逢连夜雨, 船迟又遇打头风
    适用于IE浏览器及非IE浏览器的xmlhttp脚本
  • 原文地址:https://www.cnblogs.com/jeddzd/p/12384562.html
Copyright © 2011-2022 走看看