• 并发编程 --锁 --死锁


    谈谈你对死锁的理解?

    死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

    手动模拟一个死锁?

    public class DeadLockExample {
        public static void main(String[] args) {
            //死锁
            deadLock();
        }
    
        public static void deadLock(){
    
            Object lock1 = new Object();
            Object lock2 = new Object();
    
            //线程一拥有lock1 试图获取lock2
            new Thread(() -> {
                synchronized (lock1){
                    System.out.println("获取Lock1成功");
                    try{
                        TimeUnit.SECONDS.sleep(3);
                    }catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //试图获取锁lock2
                    synchronized (lock2){
                        //获得当前线程名称
                        System.out.println(Thread.currentThread().getName());
                    }
                }
            }).start();
    
            //线程二拥有lock2 试图获取lock1
            new Thread(() -> {
                synchronized (lock2){
                    System.out.println("获取 Lock2 成功");
                    try{
                        TimeUnit.SECONDS.sleep(3);
                    }catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //试图获取锁lock1
                    synchronized (lock1){
                        //获得当前线程名称
                        System.out.println(Thread.currentThread().getName());
                    }
                }
            }).start();
    
    
        }
    
    }

    运行结果:

    死锁发生必须满足的条件?

    必须满足以下四个条件:

    1)互斥条件:一个资源每次只能被一个进程使用。

    2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

    3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

    4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

    避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。

    常见面试题:

    (2)什么是死锁?手动模拟一个死锁?

     参考/好文:

    百度百科 -- 死锁

    https://baike.baidu.com/item/%E6%AD%BB%E9%94%81/2196938?fr=aladdin

    拉钩课程 -- Java面试真题及源码

    https://kaiwu.lagou.com/course/courseInfo.htm?courseId=59#/detail/pc?id=1766

    希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。更多好文推荐,请关注我的微信公众号--JustJavaIt
  • 相关阅读:
    PHP去除所有的空格
    PHP学习之分页类
    PHP学习之验证码类
    PHP学习之迭代生成器
    PHP学习之PHP trait解析
    PHP学习之PHP代码的优化
    PHP学习之PHP的语法糖
    PHP学习之PHP编码习惯
    PHP介绍
    Centos7安装PHP、安装MySQL、安装apache
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/12610562.html
Copyright © 2020-2023  润新知