java多线程-死锁和死锁避免

conda环境的复制、备份操作 请确保将 source_env 替换为你要复制的现有环境的名称,并将 target_env 替换为你要创建的新环境的名称。要备份一个Conda虚拟环境,你需要将环境的配置信息和依赖包列表保存起来,以便在需要的时候能够重新创建相同的环境。要将现有的 conda 环境复制为其他环境,可以使用 conda create 命令并克隆已存在的环境。 阅读详情

一、死锁产生的四个必要条件

  • 互斥条件:某个资源只能被一个进程使用,其他线程请求资源只能等待,直到当前线程释放资源(不可优化项)
  • 占有并等待:进程已经保持一个资源,但是又提出了新要求,而这个资源被其他线程,自己保持的资源不被释放
  • 不可枪占条件:一个进程的资源未使用完,不会释放资源
  • 循环等待:线程获取资源存在一个循环链

二、死锁避免解决方案

  • 破坏互斥:对于共享资源,我们要破坏互斥条件,例如多线程对于只读文件的读取操作
  • 破坏占有并等待:当一个进程申请一个资源时,它不能占有其他资源。可以通过两种方式实现,方式一一个进程在执行前需要申请其所需的所有的资源。方式二,进程在没有资源时才可以申请。两种方式都有着缺点是会造成资源浪费和进程饥饿发生
  • 破坏不可枪占条件:如果一个线程持有一些资源,那么如果继续请求其他资源的时候,发现不能请求成功,这个时候其他进程就可以枪占该进程的资源。
  • 采用合适的进程推进顺序造成线程-银行家算法

三、银行家算法避免死锁

四、 一个死锁实例

package Concurrence;

/**
 * Created by luckyboy on 2018/8/7.
 */
public class DeadLock {
    public static void main(String[] args){
        Common common = new Common();
        Thread7 thread7 = new Thread7(common);
        Thread8 thread8 = new Thread8(common);
        thread7.start();
        thread8.start();
    }
}
class Thread7 extends Thread{
    private Common common;
    public Thread7(Common common){
        this.common = common;
    }
    @Override
    public void run(){
        common.methodA();
    }
}
class Thread8 extends Thread{
    private Common common;
    public Thread8(Common common){
        this.common = common;
    }
    @Override
    public void run(){
        common.methodB();
    }
}
class Common{
    private Object obj1 = new Object();
    private Object obj2 = new Object();
    public void methodA(){
        synchronized (obj1){
            try {
                Thread.sleep(3000);
                System.out.println(Thread.currentThread().getName()+"获取了当前obj1的锁");
                synchronized(obj2){
                    System.out.println(Thread.currentThread().getName()+"获取了obj2的锁");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
    public void methodB(){
        synchronized (obj2){
            try {
                Thread.sleep(3000);
                System.out.println(Thread.currentThread().getName()+"获取了当前obj2的锁");
                synchronized(obj1){
                    System.out.println(Thread.currentThread().getName()+"获取了obj1的锁");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

输出结果

五、线程运行查看工具jstack

打开PowerShell,运行下面的命令

PS C:\WINDOWS\system32> jstack

输出结果如下

Usage:
    jstack [-l] <pid>
        (to connect to running process)
    jstack -F [-m] [-l] <pid>
        (to connect to a hung process)
    jstack [-m] [-l] <executable> <core>
        (to connect to a core file)
    jstack [-m] [-l] [server_id@]<remote server IP or hostname>
        (to connect to a remote debug server)

Options:
    -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
    -m  to print both java and native frames (mixed mode)
    -l  long listing. Prints additional information about locks
    -h or -help to print this help message

运行上面的语句我们可以获取一个线程的id、优先级、nid、是否是守护线程、线程的运行转态。
我们运行上面的DeadLockTest,然后去任务管理器查看我们的进程ID
这里写图片描述

在PowerShell中输入下面的命令

PS C:\WINDOWS\system32> jstack -l 11052

得到的输出结果如下

2018-08-07 09:21:39
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.151-b12 mixed mode):

"DestroyJavaVM" #13 prio=5 os_prio=0 tid=0x0000000003182800 nid=0x2f28 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Thread-1" #12 prio=5 os_prio=0 tid=0x000000001b88e000 nid=0x27dc waiting for monitor entry [0x000000001c5ff000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at Concurrence.DeadLock.methodB(DeadLockTest.java:59)
        - waiting to lock <0x0000000780617130> (a java.lang.Object)
        - locked <0x0000000780617140> (a java.lang.Object)
        at Concurrence.Thread8.run(DeadLockTest.java:33)

   Locked ownable synchronizers:
        - None

"Thread-0" #11 prio=5 os_prio=0 tid=0x000000001b88b000 nid=0x11c0 waiting for monitor entry [0x000000001c4ff000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at Concurrence.DeadLock.methodA(DeadLockTest.java:45)
        - waiting to lock <0x0000000780617140> (a java.lang.Object)
        - locked <0x0000000780617130> (a java.lang.Object)
        at Concurrence.Thread7.run(DeadLockTest.java:23)

   Locked ownable synchronizers:
        - None
//......这里省略了GC线程和一些daemon线程信息
Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x0000000003278618 (object 0x0000000780617130, a java.lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x000000000327ab38 (object 0x0000000780617140, a java.lang.Object),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at Concurrence.DeadLock.methodB(DeadLockTest.java:59)
        - waiting to lock <0x0000000780617130> (a java.lang.Object)
        - locked <0x0000000780617140> (a java.lang.Object)
        at Concurrence.Thread8.run(DeadLockTest.java:33)
"Thread-0":
        at Concurrence.DeadLock.methodA(DeadLockTest.java:45)
        - waiting to lock <0x0000000780617140> (a java.lang.Object)
        - locked <0x0000000780617130> (a java.lang.Object)
        at Concurrence.Thread7.run(DeadLockTest.java:23)

Found 1 deadlock.

线程信息解读

字段信息解读
Thread-1线程名称
prio=5线程优先级
tid=0x000000001b88e000线程id
java.lang.Thread.State: BLOCKEDjava线程状态为阻塞状态
locked <0x0000000780617140>获得了<0x0000000780617140>这个对象
waiting to lock <0x0000000780617140>等待获取的对象的锁
“华为杯”研究生数学建模竞赛2017年-【华为杯】B题:面向下一代光通信的 VCSEL 激光器仿真模型 得出以下主要结论:在相同的偏置电流条件下,随着温度的升高,带宽的峰值向。在相同的温度下,随着电流的增大,带宽的峰值越小且曲线由波峰形状。方案,包括可能的数学公式,不同温度和偏置电流下的带宽响应曲线,并与问题。线,得出以下主要结论:在相同的偏置电流条件下,随着温度的升高,带宽的峰。在相同的温度下,随着电流的增大,带宽的峰值越小且曲线由波峰形状逐渐变得。得的激光器特性曲线和模型中仿真得到的特性曲线,之后,可以将两组曲线的差。说明的是,由于数值优化算法的成功与否很大程度上依赖于初始参数的猜测,参。 阅读详情

相关推荐

Windows 高精度计时器:QueryPerformanceCounter 原理、陷阱与最佳实践

本文深入解析Windows高精度计时器QueryPerformanceCounter(QPC)的工作原理、常见陷阱及最佳实践。QPC通过读取硬件计时器(如TSC)实现微秒级精度,适用于游戏开发、音视频处理等高性能场景。文章详细探讨了多核同步、动态频率调整等挑战,并提供了优化代码示例和性能对比数据。

weixin_33391446的博客 271

jstack命令解析

jstack用法 /opt/java8/bin/jstack Usage: jstack [-l] <pid> (to connect to running process) 连接活动线程 jstack -F [-m] [-l] <pid> (to connect to a hung process) 连接阻塞线程...

denghonghao的博客 1900

pgAdmin4备份恢复实战:从安装到避坑指南

本文提供了一份详尽的pgAdmin4备份恢复实战指南,涵盖从安装配置到执行备份恢复的全流程。针对Windows环境下的浏览器兼容性、二进制路径配置等常见问题,给出了具体解决方案。重点强调了使用pgAdmin4进行备份恢复的可靠性,特别是在处理包含PostGIS等扩展的数据库时,能有效避免数据类型和权限错误,确保数据迁移的完整性与安全性。

weixin_29266007的博客 439

Locked ownable synchronizers(转)

public class DeadLock { public static void main(final String[] args) throws Exception { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread.currentThread().setName("main-thread"); final Thread r

Mr_moving 8801

ffmpeg在windows的安装、合并、切片、.m4s、.m3u8处理

自己处理视频,我用的工具是 ffmpeg,因为涉及到.m3u8格式和.m4s格式的一些操作。ffmpeg的介绍我就不多说了,这里是它的官网地址: https://ffmpeg.org/ ,这里是文档: https://ffmpeg.org/documentation.html (看的头大,没咋看下去)...

一只爱吃糖的小羊 2689

关于小样本学习综述论文的总结

对小样本学习综述的个人总结

qq_46176086的博客 5456

死锁定位解决

死锁 死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 死锁发生的原因 死锁的发生是由于资源竞争导致的,导致死锁的原因如下: 系统资源不足,如果系统资源充足,死锁出现的可能性就很低。 进程(线程)运行推进的顺序不合适。 资源分配不当等。 死锁发生的条件 死锁的发生的四个必要条件: 互斥条件:一个资源每次只能被一个进程使用。 占有且等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 不可强行占有:进程(线

to_real的博客 3966

如何设计一个处理物联网设备数据流的后端系统。

设计一个处理物联网设备数据流的后端系统,需要综合考虑设备数据采集、传输、处理、存储等多个方面,保证系统能够处理海量数据,具备高可用性、扩展性和安全性。合理选择适当的技术架构和工具(如MQTT、Kafka、InfluxDB等),并确保系统能够灵活应对不断变化的业务需求和设备接入。

weixin_53227829的博客 839

java多线程死锁的四个条件_java多线程基本概述(四)——死锁

Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.6-b01 mixed mode):"DestroyJavaVM" prio=6 tid=0x000000000096c000 nid=0x494 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNAB...

weixin_29713403的博客 687

【脑电分析系列】第7篇:频域分析基石 — 功率谱密度(PSD)的计算与常见方法对比

本文探讨了脑电图(EEG)频域分析的核心方法——功率谱密度(PSD)。通过对比基于快速傅里叶变换的周期图法和更稳健的Welch's方法,指出后者通过分段、加窗和平均处理,能有效降低估计方差,更适合分析非稳态的脑电信号。文章详细解析了关键参数设置对频率分辨率和统计稳定性的影响,并提供了Python计算实现。PSD分析将复杂的脑电信号转换为直观的频域特征,为研究认知功能和神经疾病提供重要依据。

qq_32516809的博客 1805

PhotovoltaicPanelCleanlinessDetector:基于YOLOv8的光伏板清洁状态监测系统

data.yamlyaml复制编辑names:0: clean1: dust3: leaves4: shadow✅ 高精度污染识别✅ 具备实时检测与UI展示✅ 可本地化部署应用未来方向增加污染程度分级(轻度、中度、严重)加入时间序列分析(污染变化趋势预测)无人机集成巡检模块。

YOLO 276

JAVA并发| 记录一次死锁(二)与Locked ownable synchronizers

package com.xiaobu.deadlock; import java.util.concurrent.*; /** * @author xiaobu * @version JDK1.8.0_171 * @date on 2019/8/21 17:16 * @description */ public class ExcuteLock { static Exec...

小布1994的博客 6426

【LangChain编程:从入门到实践】实现多模态代理

【LangChain编程:从入门到实践】实现多模态代理 关键词:LangChain, 多模态代理, 自然语言处理, 机器学习, 知识图谱, 对话系统, 代码生成, AI代理 1. 背景介绍 随着人工智

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 581

【java中如何避免死锁及其分析和解决多线程环境下的死锁问题】

保持锁的顺序一致:如果多个线程需要多个锁来完成任务,保持获取锁的顺序一致,可以减少死锁的产生。这样可以避免不同线程获取锁的顺序不一致导致的死锁。避免循环等待:设计时尽量避免循环等待的情况出现,即一个线程等待另一个线程持有的资源,而后者又在等待前者持有的资源。强制释放资源:找出造成死锁的线程和资源,强制释放其中的一个或多个资源,打破死锁的循环。注意锁的粒度:尽量将锁的粒度控制在最小范围内,这样可以减少锁的争用,降低死锁的概率。避免使用多个锁:尽可能地减少多线程环境中使用的锁的数量,可以降低死锁的发生概率。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 1160

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java多线程编程中如何避免死锁和饥饿现象?

同时,遵循最佳实践,简化程序设计,使用高级并发工具,编写清晰的文档和注释,并进行充分的测试,有助于编写稳定、高效的Java多线程程序。(4)循环等待条件:存在一个等待循环,线程集合{P1, P2, ..., Pn}中的P1正在等待由P2占有的资源,P2正在等待由P3占有的资源,...,Pn正在等待由P1占有的资源。(3)避免线程长时间占用资源:限制线程持有资源的时间,避免某个线程长时间占用资源导致其他线程饥饿。(2)占有和等待条件:一个线程至少已经持有一个资源,并正在等待获取一个当前被其他线程持有的资源。

AdolphMacDonald的博客 872

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java多线程同步机制中如何避免死锁和活锁

为了避免这些问题,我们需要深入理解死锁和活锁的概念、原因,并采取适当的策略来预防和解决这些问题。通过避免嵌套锁、设置锁超时、使用高级并发工具、引入随机等待、设计合理的重试策略、引入协调者和使用消息传递等方法,我们可以有效地降低死锁和活锁的风险,提高程序的并发性能和可靠性。通过不断的学习和实践,我们可以逐渐掌握Java多线程同步机制的精髓,为构建高效、稳定的并发系统打下坚实的基础。死锁是指两个或更多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法向前推进。

derickForster的博客 1198

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java多线程安全编程指南:如何避免死锁和竞态条件

🚀 想要写出高性能的Java应用?掌握多线程安全编程是必经之路!本文将为你揭秘Java多线程编程中的两大"挑战"——死锁和竞态条件,并提供完整的解决方案。无论你是Java初学者还是资深开发者,这份终极指南都将帮助你构建更加稳定可靠的并发应用。 ## 什么是多线程安全问题?🤔 在Java多线程编程中,**线程安全**是确保程序正确性的关键。当多个线程同时访问共享资源时,如果缺乏适当的同步机制

gitblog_00137的博客 967

Java线程避免死锁_如何避免多线程死锁?多线程死锁的原因和幸免策略

在多线程编程过程中,不仅仅要解决数据访问的同步与互斥,还要注意多线程的死锁问题,而造成多线程死锁的原因大概可以归咎于系统资源不足、进程推进顺序不当或者资源分配不当等问题。有什么方法可以避免多线程死锁的形成吗?请看下文。一、死锁原因与形成条件:死锁形成的原因:1、系统资源不足;2、进程(线程)推进的顺序不恰当;3、资源分配不当。从编程经验上来讲,形成死锁的一般原因有以下几种:1、个人使用锁的经验差异...

weixin_31557179的博客 359

JAVA多线程死锁怎么找_java多线程死锁和避免方法

死锁是常见的线程活性问题。多个线程互相等待对方而导致永远暂停称为死锁。常见的死锁q情况是线程A持有锁L1的情况下申请锁L2,线程B持有锁L2申请锁L1。线程A等待锁L2释放,线程B等待锁L1释放,从而互相等待永远暂停。死锁的必要条件1. 资源互斥,资源同时只能被一个线程占用。2. 资源不可抢夺,资源被一个线程占用时,其他线程无法抢夺。3. 占用并等待资源,线程持有资源,并申请另外的资源而进入等待时...

weixin_39952074的博客 136

JAVA基础多线程-模拟线程死锁以及预防和避免死锁

线程死锁描述的是这样一种情况:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

0 619

java多线程学习之死锁的模拟和避免

1.死锁 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 Java 死锁产生的四个必要条件:     1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用     2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。     3、请求和保持,即当资

不忘初心的博客 1008

java模拟死锁_java多线程学习之死锁的模拟和避免(实例讲解)

1.死锁死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。Java 死锁产生的四个必要条件:1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。...

weixin_42525569的博客 367

17、Java并发性和多线程-避免死锁

以下内容转自http://ifeve.com/deadlock-prevention/: 在有些情况下死锁是可以避免的。本文将展示三种用于避免死锁的技术: 加锁顺序 当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。 如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生。看下面这个例子: Thread 1: lock A loc...

angou6476的博客 86

java mysql 死锁_java – 多线程 – 避免和处理数据库死锁

我正在寻找一个从Java 6应用程序中处理数据库死锁的好策略;可能会有几个并行线程同时写入同一个表.如果数据库(Ingres RDMBS)检测到死锁,它将随机杀死其中一个会话.考虑到以下要求,处理死锁情况的可接受技术是什么?>应保留总耗用时间尽可能小的>杀一个会议将招致一个重大(可衡量的)回滚>时间线程没有办法彼此沟通,即战略应该是自主的到目前为止,我提出的策略是这样的:shor...

weixin_26717681的博客 532

【Java并发性和多线程】避免死锁

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33743880的博客 99

Java多线程之死锁(死锁产生条件、手写简单死锁程序、破坏死锁)(面试常有)

本篇博客主要学习和讨论的内容是:Java中小型面试经常出现的"死锁"、"死锁产生的四个必要条件"、"手写简单死锁程序"、"如何破坏死锁"等相关问题。里面详细的解读了实际生活"死锁"情形、程序"死锁"情形,并提到了如何解决该类"死锁"问题...

岁岁岁平安的博客 1898
上一篇: Java基础-反射基础
下一篇: java-异常处理机制
markliwei1
博客等级 码龄10年 26粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值