并发编程--死锁

简介: 并发编程--死锁

@[toc]

什么是多线程死锁?

同步中嵌套同步,导致锁无法释放

多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
1、系统资源的竞争

通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。

2、进程推进顺序不合适

进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。例如,并发进程 P1、P2分别保持了资源R1、R2,而进程P1申请资源R2,进程P2申请资源R1时,两者都会因为所需资源被占用而阻塞。

package com.yxl.demo.ThreadTest;

public class test5 {

    public static void main(String[] args) throws InterruptedException {

        TestDemo thread = new TestDemo();

        Thread t1 = new Thread(thread,"窗口一");
        Thread t2 = new Thread(thread,"窗口二");
        t1.start();
        Thread.sleep(40);
        thread.flag = false;
        t2.start();
    }
}

class TestDemo implements Runnable{
    //共享的火车票变量
    private volatile  int count = 100;

    private  Object object =new Object();

    boolean flag = true;
    //重寫run方法
    @Override
    public void run() {

           if(flag){
               while (count > 0) {
                   synchronized (object) {
                       sale();
                   }
               }
           }else{
               while (count > 0) {

                       sale();

               }
           }


        }



    public synchronized  void sale() {
        try {
            Thread.sleep(50);
        }catch (Exception e){

        }
        synchronized (object) {
            if (count > 0) {
                System.out.println(Thread.currentThread().getName() + "出售 :" + (100 - count + 1));
                count--;
            }
        }
    }

  /*

    public void sale(){
        synchronized (object){
            if(count > 0){
                System.out.println(Thread.currentThread().getName() +"出售 :" +(100 - count + 1));
                count--;
            }
        }
    }*/

}

执行结果:如图所示,红灯一直亮着,锁一直没释放,导致死锁的发生,程序卡住
t1 先获取object锁,在获取this锁,
t2 先获取this锁 ,在获取object锁
在这里插入图片描述

如何解决死锁的发生

  1. 加锁顺序(线程按照一定的顺序加锁)
  2. 加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
  3. 死锁检测
相关文章
|
Python
正则表达前一个元素出现零次或多次
正则表达前一个元素出现零次或多次
533 3
|
资源调度 Java 流计算
flink yarn-per-job提交报错
flink yarn-per-job提交这个是什么问题吗,主机端口都是正常的,就报了拒绝连接?image.png 一提交到yarn就报这个错,然后失败,提交命令 flink run -t yarn-per-job -c app.dwm.UVFilterDetail /root/gmall_flink/flink_app/gmall-start-try-self-do-1.0-SNAPSHOT-jar-with-dependencies.jar,yarn-session提交是正常的,就per-job有问题?
269 1
|
自然语言处理 数据格式
【DSW Gallery】基于ModelScope的中文GPT-3模型(1.3B)的微调训练
本文基于ModelScope,以GPT-3(1.3B)为例介绍如何使用ModelScope-GPT3进行续写训练与输入输出形式的训练,训练方式不需要额外指定,训练数据集仅包含 src_txt 时会进行续写训练,同时包含 src_txt 和 tgt_txt 时会进行输入输出形式的训练。
【DSW Gallery】基于ModelScope的中文GPT-3模型(1.3B)的微调训练
|
3月前
|
物联网 Java API
什么是智慧校园电子班牌系统?如何与学校现有系统对接?
智慧校园电子班牌系统是教育信息化的重要工具,集校园管理、家校互动、教学辅助于一体。它支持信息展示、智能考勤、家校留言、教学互动等功能,提升校园管理效率与教学质量。系统通过RESTful API、WebSocket等接口,与学校教务系统、一卡通、安防系统等无缝对接,实现数据实时同步与统一管理。模块化设计便于集成,保障信息互联互通,助力智慧校园建设。
253 6
|
10月前
|
传感器 算法
基于GA遗传算法的多机无源定位系统GDOP优化matlab仿真
本项目基于遗传算法(GA)优化多机无源定位系统的GDOP,使用MATLAB2022A进行仿真。通过遗传算法的选择、交叉和变异操作,迭代优化传感器配置,最小化GDOP值,提高定位精度。仿真输出包括GDOP优化结果、遗传算法收敛曲线及三维空间坐标点分布图。核心程序实现了染色体编码、适应度评估、遗传操作等关键步骤,最终展示优化后的传感器布局及其性能。
257 13
|
数据挖掘
【数据分析】大型ADCP数据集的处理和分析(Matlab代码实现)
【数据分析】大型ADCP数据集的处理和分析(Matlab代码实现)
696 0
|
XML Java 数据库连接
【异常解决】解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题
【异常解决】解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题
475 0
|
存储 JSON 算法
谷粒学院(十五)JWT | 阿里云短信服务 | 登录与注册前后端实现(一)
谷粒学院(十五)JWT | 阿里云短信服务 | 登录与注册前后端实现(一)
谷粒学院(十五)JWT | 阿里云短信服务 | 登录与注册前后端实现(一)
|
存储 开发工具 Python
Windows中pycharm最详细安装教程及注意事项
Windows中pycharm最详细安装教程及注意事项
1148 0
Windows中pycharm最详细安装教程及注意事项