并发编程 --锁 --死锁

谈谈你对死锁的理解?

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

手动模拟一个死锁?

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
原文地址:https://www.cnblogs.com/liaowenhui/p/12610562.html