美文网首页
Java死锁范例和 对应解决方案

Java死锁范例和 对应解决方案

作者: 欢乐时光欢乐你我 | 来源:发表于2019-04-27 13:27 被阅读0次

    synchronized 没有嵌套 不会死锁

    package Java死锁范例;
    
    public class ThreadDeadlock2 {
        //这种  没有嵌套   不会死锁
        public static void main(String[] args) throws InterruptedException {
            Object obj1 = new Object();
            Object obj2 = new Object();
            Object obj3 = new Object();
     
            Thread t1 = new Thread(new SyncThread2(obj1, obj2), "t1");
            Thread t2 = new Thread(new SyncThread2(obj2, obj3), "t2");
            Thread t3 = new Thread(new SyncThread2(obj3, obj1), "t3");
     
            t1.start();
            Thread.sleep(5000);
            t2.start();
            Thread.sleep(5000);
            t3.start();
            
            
     
        }
     
    }
     
    class SyncThread2 implements Runnable{
        private Object obj1;
        private Object obj2;
     
        public SyncThread2(Object o1, Object o2){
            this.obj1=o1;
            this.obj2=o2;
        }
        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            System.out.println(name + " 准备锁"+obj1);
            //这种  没有嵌套   不会死锁
            synchronized (obj1) {
                 System.out.println(name + " 锁定 "+obj1);
                 work();
                 System.out.println("---------------------------------------------------------");
            }
            System.out.println(name + " 释放 锁"+obj1);
            
            System.out.println("---------------------------------------------------------");
            System.out.println(name + "准备锁"+obj2);
            synchronized (obj2) {
                System.out.println(name + " 锁定 "+obj2);
                work();
            }
            System.out.println(name + " 释放锁"+ obj2 );
            
            System.out.println(name + "---------------------> finished execution.");
        }
        
        
        private void work() {
            try {
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

    结果:

    t1 准备锁java.lang.Object@3e9041fa
    t1 锁定 java.lang.Object@3e9041fa
    t2 准备锁java.lang.Object@a8f72d1
    t2 锁定 java.lang.Object@a8f72d1
    t3 准备锁java.lang.Object@76f1ebbf
    t3 锁定 java.lang.Object@76f1ebbf
    ---------------------------------------------------------
    t1 释放 锁java.lang.Object@3e9041fa
    ---------------------------------------------------------
    t1准备锁java.lang.Object@a8f72d1
    ---------------------------------------------------------
    t1 锁定 java.lang.Object@a8f72d1
    t2 释放 锁java.lang.Object@a8f72d1
    ---------------------------------------------------------
    t2准备锁java.lang.Object@76f1ebbf
    ---------------------------------------------------------
    t3 释放 锁java.lang.Object@76f1ebbf
    ---------------------------------------------------------
    t2 锁定 java.lang.Object@76f1ebbf
    t3准备锁java.lang.Object@3e9041fa
    t3 锁定 java.lang.Object@3e9041fa
    
    

    相关文章

      网友评论

          本文标题:Java死锁范例和 对应解决方案

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