zoukankan      html  css  js  c++  java
  • java 死锁简单分析

    1. 看一段代码关于死锁

    public class DeadLockDemo2 {
    
        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 SyncThread(obj1, obj2), "t1");
            Thread t2 = new Thread(new SyncThread(obj2, obj1), "t2");
    
            t1.start();
            Thread.sleep(500);
            t2.start();
        }
    
    }
    
    // 定义一个线程对象
    class SyncThread implements Runnable {
        private Object obj1;
        private Object obj2;
    
        public SyncThread(Object o1, Object o2) {
            this.obj1 = o1;
            this.obj2 = o2;
        }
    
        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            System.out.println(name + " acquiring lock on " + obj1);
            // 两个锁对象,这了有一个线程进入之后就持有了obj1,那么另一个线程因为obj1被持有了,那么就
            // 不会持有obj1,而会进入到obj2,那么线程1因为此时持有了obj1,而obj2却被另一个线程持有,那么
            // 现在的线程1就没办法获取到obj2,就会一直处于等待状态,而线程2也是处于等待
            synchronized (obj1) {
                System.out.println(name + " acquired lock on " + obj1);
                work(1);
                System.out.println(name + " acquiring lock on " + obj2);
                // 这里obj2被互斥
                synchronized (obj2) {
                    System.out.println(name + " acquired lock on " + obj2);
                    work(2);
                }
                System.out.println(name + " released lock on " + obj2);
            }
            System.out.println(name + " released lock on " + obj1);
            System.out.println(name + " finished execution.");
        }
    
        private void work(int i) {
            try {
                String name = Thread.currentThread().getName();
                if (i == 1) {
                    System.out.println(name + " working sleep " + i + " # " + this.obj1);
                } else {
                    System.out.println(name + " working sleep " + i + " # " + this.obj2);
                }
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    通过两次的互斥,并且对不同对象进行互斥,然后两个线程持有这两个对象进行操作,就死锁了

  • 相关阅读:
    HDU 1863 畅通project (最小生成树是否存在)
    经常使用MD5算法代码
    HDU 5045(Contest-费用流)[template:费用流]
    【c语言】统计一个数二进制中的1的个数
    git
    如何在阿里云服务器里配置iis 搭建web服务
    war包放入tomcat
    互联网推送服务原理:长连接+心跳机制(MQTT协议)
    保持Service不被Kill掉的方法--双Service守护 && Android实现双进程守护 3
    保持Service不被Kill掉的方法--双Service守护 && Android实现双进程守护 2
  • 原文地址:https://www.cnblogs.com/xxss0903/p/6019682.html
Copyright © 2011-2022 走看看