常见面试题之死锁

定义

死锁就是两个或两个以上的线程在执行过程中,由于竞争资源或者互相通信导致彼此占用对方的锁资源而造成的一种阻塞现象,在没有外界作用下都在等待对方释放锁资源,导致程序无法进行下去。

上代码

java 复制代码
public class t9 {
    public static void main(String[] args) {
        //定义了两把锁
        Object lockA = new Object();
        Object lockB = new Object();
        //使用lanbda表达式新建线程
        Thread t1 = new Thread(() -> {
            // 1.占有一把锁(锁A)
            synchronized (lockA) {
                System.out.println("线程1:获得锁A。");
                // 休眠 1s(让线程2有时间先占有锁B)
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 2.获取线程2的锁B
                synchronized (lockB) {
                    System.out.println("线程1:嘿嘿,我抢到锁B了。");
                }
            }
        });
        t1.start();

        Thread t2 = new Thread(() -> {
            // 1.占有一把锁(锁B)
            synchronized (lockB) {
                System.out.println("线程2:获得了锁B!");
                // 休眠1s(保证线程1能有充足的时间得到锁A)
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 2.获取线程1的锁A
                synchronized (lockA) {
                    System.out.println("线程2:嘿嘿,我抢到锁A了!");
                }
            }
        });
        t2.start();

    }
}

解决方案

1.修改请求并持有条件

获得了一把锁就不再请求另一把锁,别吃着碗里看着锅里了

2.破坏环路等待条件

以确定的顺序获得锁,系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,比如上面线程一和二按照数字大小依次请求锁A和B

3.超时放弃

如果在一定时间内没有获得锁,就将之前获得的锁全部释放

相关推荐
赖赖赖先生3 分钟前
fastadmin 框架 生成qr code 二维码图片,PHP 7.4版本
开发语言·php
字节流动26 分钟前
Android Java 版本的 MSAA OpenGL ES 多重采样
android·java·opengles
玉红7771 小时前
R语言的数据类型
开发语言·后端·golang
夜斗(dou)1 小时前
node.js文件压缩包解析,反馈解析进度,解析后的文件字节正常
开发语言·javascript·node.js
觅远1 小时前
python+PyMuPDF库:(一)创建pdf文件及内容读取和写入
开发语言·python·pdf
呜呼~225142 小时前
前后端数据交互
java·vue.js·spring boot·前端框架·intellij-idea·交互·css3
神雕杨2 小时前
node js 过滤空白行
开发语言·前端·javascript
飞的肖2 小时前
从测试服务器手动热部署到生产环境的实现
java·服务器·系统架构
周伯通*2 小时前
策略模式以及优化
java·前端·策略模式
两点王爷2 小时前
Java读取csv文件内容,保存到sqlite数据库中
java·数据库·sqlite·csv