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();
            
       }
             
    }
    
  • 相关阅读:
    汇编中寄存器及其用处
    直接打印则需要调用PrintDocumnt.Print()方可打印,否按在对话框中点【打印】但不会有反应
    操作另一窗体的变量事件
    System.Windows.Forms.ListControl.SelectedValue.get 返回 null
    combox的selectedValue初始值注意事项
    vs2017中EF6.4无法导入到PM中,应使用EF6.2或6.1.1
    去除 Datetime的字段会自动赋默认值0001-1-1 0:00:00
    EF使用问题备忘
    EF中自定义连接字符串
    C#如何改变DataTable中的数据?
  • 原文地址:https://www.cnblogs.com/jeddzd/p/12384562.html
Copyright © 2011-2022 走看看