如何构建一个死锁?

海康H304NAS 刷机飞牛 本文旨在分享如何将闲置的海康威视H304 NAS刷入飞牛NAS系统,并利用iStoreOS作为安装媒介。之前因为使用极空间NAS,这台H304闲置已久。最近尝试了飞牛NAS,在虚拟机上安装后挂载极空间的电影资源,体验不错,于是决定重新折腾这台H304。我个人喜欢尝试新系统,之前经常更新H304的固件,但设备总在使用一两年后出现故障,需要联系技术清理日志才能恢复。最后一次设备“变砖”后,连技术人员也联系不上了,自己尝试修复未果,设备就此闲置两三年。 阅读详情

程序中的死锁指的是两个或两个以上的线程,相互等待对方释放某个锁,而造成无限等待的一种情况

如何构建死锁?

以下就是一个死锁的例子

package MultiThread;

/** 
 * Java program to create a deadlock by imposing circular wait.
 * 
 * @author William
 * 
 */

public class DeadLock {


    private class Running1 implements Runnable {
        /*
         * This method request two locks, first String and then Integer
         */
        @Override
        public void run() {
            while (true) {
                synchronized (String.class) {
                    System.out.println("Thread1 Aquired lock on String.class object");

                    synchronized (Integer.class) {
                        System.out.println("Thread1 Aquired lock on Integer.class object");
                    }
                }               
            }
        }

    }

    private class Running2 implements Runnable {
        /*
         * This method also requests same two lock but in exactly
         * Opposite order i.e. first Integer and then String
         * This creates potential deadlock, if one thread holds String lock
         * and other holds Integer lock and they wait for each other, forever
         */
        @Override
        public void run() {
            while (true) {
                synchronized (Integer.class) {
                    System.out.println("Thread2 Aquired lock on Integer.class object");

                    synchronized (String.class) {
                        System.out.println("Thread2 Aquired lock on String.class object");
                    }
                }               
            }
        }       
    }

    public static void main(String[] args) {
        DeadLock deadLock = new DeadLock();
        Running1 r1 = deadLock.new Running1();
        Running2 r2 = deadLock.new Running2();

        Thread thread1 = new Thread(r1);
        Thread thread2 = new Thread(r2);

        thread1.start();
        thread2.start();
    }
}
Console output :

Thread1 Aquired lock on String.class object
Thread2 Aquired lock on Integer.class object
无限等待

在上面这个例子中,我们有两个线程,以相反的顺序去获取两个锁,最后陷入了Thread1持有String锁,等待Integer锁,Thread2持有Integer锁,等待String锁的无限等待,即死锁情景

如何避免死锁?

避免死锁的关键在于应使不同线程获取锁的顺序保持一致,例如都先获取String锁,再获取Integer锁,我们可以做如下修改

package MultiThread;

/** 
 * Java program to create a deadlock by imposing circular wait.
 * 
 * @author William
 * 
 */

public class DeadLock {


    private class Running1 implements Runnable {
        /*
         * This method request two locks, first String and then Integer
         */
        @Override
        public void run() {
            while (true) {
                synchronized (String.class) {
                    System.out.println("Thread1 Aquired lock on String.class object");

                    synchronized (Integer.class) {
                        System.out.println("Thread1 Aquired lock on Integer.class object");
                    }
                }               
            }
        }

    }

    private class Running2 implements Runnable {
        /*
         * This method requests same two lock in the same
         * order i.e. first String and then Integer
         * This will not create any deadlock risk 
         */
        @Override
        public void run() {
            while (true) {
                synchronized (String.class) {
                    System.out.println("Thread2 Aquired lock on Integer.class object");

                    synchronized (Integer.class) {
                        System.out.println("Thread2 Aquired lock on String.class object");
                    }
                }               
            }
        }       
    }

    public static void main(String[] args) {
        DeadLock deadLock = new DeadLock();
        Running1 r1 = deadLock.new Running1();
        Running2 r2 = deadLock.new Running2();

        Thread thread1 = new Thread(r1);
        Thread thread2 = new Thread(r2);

        thread1.start();
        thread2.start();
    }
}
Console output :

Thread1 Aquired lock on String.class object
Thread1 Aquired lock on Integer.class object
Thread1 Aquired lock on String.class object
Thread1 Aquired lock on Integer.class object
Thread2 Aquired lock on String.class object
Thread2 Aquired lock on Integer.class object
...
linux离线安装nginx 阅读详情

相关推荐

STK中的传感器与通信组件:雷达、发射机、接收机与天线的协同建模

本文深入解析了STK软件中传感器、雷达、发射机、接收机与天线的协同建模方法。通过构建一个完整的卫星对地数传系统实例,阐述了各组件如何分工协作,实现从几何指向到射频链路的高保真仿真,为复杂航天通信与探测系统的设计与分析提供了高效、灵活的解决方案。

weixin_29271263的博客 273

gaussdb 数据库参数说明【锁管理、容错性】【13】

1. 锁管理 在 GaussDB 中,并发执行的事务由于竞争资源会导致死锁。管理事务锁的机制的一些参数。 deadlock_timeout 参数说明:设置死锁超时检测时间,以毫秒为单位。当申请的锁超过设定值时,系统会检查是否产生了死锁。 死锁的检查代价是比较高的,服务器不会在每次等待锁的时候都运行这个过程。在系统运行过程中死锁是不经常出现的,因此在检查死锁前只需等待一个相对较短的时间。增加这个值就减少了无用的死锁检查浪费的时间,但是会减慢真正的死锁错误报告的速度。在一个负载过重的服务器上,你可能需要增大它

qq_42226855的博客 2936

SolidWorks与Python二次开发实战:从宏录制到自动化脚本

本文详细介绍了利用Python对SolidWorks进行二次开发的实战方法。通过宏录制获取操作指令,再将其转换为Python脚本,工程师可以高效实现建模、出图等重复任务的自动化,显著提升设计效率。文章涵盖了环境搭建、代码转换、调试技巧及完整实战案例,为工程师提供了从入门到精通的完整路径。

weixin_29082143的博客 948

死锁和活锁详细介绍,实现原理

死锁和活锁详细介绍,实现原理

java架构师分享,有问题可以联系我 655

NX二次开发(python)-坯料尺寸(一)

一般在产品制造过程中,往往要判断一个模型在出模方向上的最小包容盒尺寸,在NX中可以用坯料尺寸命令实现,当然也有相应的代码实现,这或许可以帮助我们实现一些产品的坯料尺寸批量输出,节省人力。

dasfanfan的博客 818

Windows Server 2019整机备份与异机还原实战:从虚拟机到物理机的完整迁移指南

本文详细介绍了Windows Server 2019整机备份与异机还原的实战操作,涵盖从虚拟机到物理机的完整迁移流程。通过环境准备、备份策略设计、具体操作步骤及迁移后优化等内容,帮助用户实现系统环境的无缝迁移,特别适用于服务器硬件升级、数据中心迁移等场景。

weixin_30555125的博客 133

【锁】如何实现死锁

目录1、创建死锁2、创建线程任务类3、测试结果4、总结 1、创建死锁 package lao.ben.juc.deadLock; import org.junit.Test; //死锁条件:两个线程互相持有对方想要的锁,对方又释放不了,就卡住了。 public class DeadLock { //方法一 String xiaowang = "xiaownag"; String xiaohong = "xiaohong"; public void together1(

numbbe的博客 2648

青藏高原冻土数据实战:如何用QGIS分析1961-2020年冻土退化趋势(附完整操作步骤)

本文详细介绍了如何使用QGIS分析1961-2020年青藏高原冻土退化趋势,包括数据准备、预处理、时空分析和模型验证等全流程操作。通过TTOP模型和Stefan方程,揭示了冻土退化的空间差异和海拔依赖性,为环境研究提供科学依据。

weixin_29276847的博客 127

并发实战-构造死锁

本篇文章将对死锁的产生和死锁的构造进行说明。

用朴素的话说技术。 316

高通平台 Android T 蓝牙技术全解析:A2DP 与 AVRCP 核心代码路径与交互流程

A2DP 接收端 - 连接流程(AVDTP 打开)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 290

山东大学机试试题合集

山东大学机试试题合集

qq_63349644的博客 2622

死锁与死锁检测

文章目录一、死锁是什么二、死锁的检测三、死锁检测的实现 一、死锁是什么 比如说以下情况,线程a占用资源1,线程b占用资源2,线程b需要资源1,线程a需要资源2,就会产生死锁 在死锁的解决方案中,log和gdb调试可以用于线程数量少的情况 线程比较多的情况就不能利用log和gdb去解决 再比如三个线程 线程A想要线程B的资源,线程B想要线程C的资源,线程C想要线程A的资源,这样就构成了一个有向图的环路 再比如,下图所示,线程A想获取线程B的锁,线程B想获取线程C的锁,线程C想获取线程D的锁,线程D想获取

qq_42331828的博客 1700

Open Dynamics Engine(ODE)物理引擎基础教程(I)——特点介绍

下一教程 Open Dynamics Engine(ODE)物理引擎基础教程(II)——相关概念 (在这一教程中将学习刚体、关节、碰撞的概念在ODE中的特点) 本文结构引言介绍特点使用ODE总结 引言 本文翻译自ODE官方教程英文版,有些地方增加了自己的理解。这一节介绍ODE的相关概念。 基础教程英文原版链接【http://ode.org/wiki/index.php?title=Manua...

腿足机器人领域 1679

构建一个hashmap死锁的DEMO

package threadmodle; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class ThreadModle { public static void main(String[] args) throws InterruptedExcepti...

weixin_30653097的博客 149

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

MySQL模拟死锁以及分析和解决方案

mysql死锁模拟案例、死锁的发生条件、怎么避免死锁、查看死锁日志以及解决方案

泡^泡 5313

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

5分钟构建死锁检测微服务原型

当检测到潜在死锁时,服务会通过配置好的Webhook URL发送JSON格式的告警,包含涉及的事务ID、锁资源等关键信息。传统解决方案往往需要复杂的监控系统,但作为一个快速验证的想法,我决定用最简单的方式搭建一个轻量级死锁检测服务。系统表,这个表包含了所有当前运行的事务信息。通过分析事务持有的锁和等待的锁,可以判断是否存在循环等待条件——也就是死锁的典型特征。上测试时,发现它的实时预览和快速部署功能让验证过程变得极其顺畅,不需要任何复杂的配置就能看到服务运行效果,对快速原型开发特别友好。

SapphireOwl29的博客 660

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

MySQL是如何进行死锁检测的?底层原理是什么?

总结起来,MySQL通过等待图算法进行死锁检测,通过构建等待图、检测图中是否存在环来判断是否发生死锁,并通过选择牺牲者进行回滚来解决死锁问题。等待图构建:当事务等待一个被其他事务占用的资源时,MySQL会在等待图中添加一条从当前事务到被等待事务的边。死锁解决:当检测到死锁后,MySQL选择一个事务作为死锁的牺牲者,并回滚该事务,释放其持有的资源。死锁解决:一旦检测到死锁,MySQL会选择一个事务作为牺牲者,并回滚该事务,释放其持有的资源。牺牲者事务的回滚会打破死锁,并允许其他事务继续执行。

长风破浪会有时的博客 1325

数据库死锁查询及处理

创建存储过程sp_who_lock,查询死锁的进程 create procedure sp_who_lock WITH ENCRYPTION as begin declare @spid int,@bl int, @intTransactionCountOnEntry int, @intRowcount int, ...

weixin_30426065的博客 1173

死锁检测组件

死锁检测组件

ajffaj的博客 395

E - 死锁 (FZU - 1924 )

E - 死锁 (FZU - 1924 ) 在操作系统中存在着死锁问题。 进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了死锁。 例如,如果线程A...

菜鸡的博客 331

死锁检测的程序C语言,求一个在C语言环境下进行死锁检测的程序

满意答案chiara3302013.10.15采纳率:54%等级:12已帮助:24879人#include#include#includeconst int MAXQUEUE=100; //定义表的最大行数typedef struct node{int resource;int process;}cell;cell occupy[MAXQUEUE];int occupy_quantity;...

weixin_33741534的博客 363

java基础总结(十二)--死锁实例

下面就是互相等待对方释放锁的一个实例,程序永远都不会停止package pri.lsx.test.thread.reentrantlock; import java.util.concurrent.locks.ReentrantLock; /** * 重入锁的使用 * 1:检查new ReentrantLock();是对象锁还是类锁.答:重入锁是对象锁 * 2:构建一个死锁的方式 * ...

秋天的猿 199

死锁检测原理

定义等待图节点,用于记录每个节点的状态和依赖关系。节点状态可以用一个 bool 变量表示,表示该节点是否被访问过。依赖关系可以用一个切片表示,记录该节点所依赖的所有节点。

qq_34893654的博客 213

mysql与oracle锁区别_MySQL入门学习之——mysql与oracle死锁对比

Oracle死锁:0.构建测试数据SQL> select * from t;ID NAME---------- ----------1 a2 b1.会话1更新第一行数据SQL> update t set name='A1' where id=1;已更新 1 行。2.会话2更新第二行数据SQL> update t set name='B2' where id=2;已更新 1 行。3...

weixin_32205057的博客 325

java多线程-死锁的一些问题

**死锁:**不同的线程相互占用对方的资源不放弃并等待对方放弃自己需要的资源,形成了僵局,从而陷入阻塞状态 必要条件 如果在一个系统中以下四个条件同时成立,那么就能引起死锁: 互斥:至少有一个资源必须处于非共享模式,即一次只有一个进程可使用。如果另一进程申请该资源,那么申请进程应等到该资源释放为止 占有并等待:—个进程应占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有。 非抢占:资源不能被抢占,即资源只能被进程在完成任务后自愿释放。 循环等待:在发生死锁时,必然存在一个进程–资源的环形链。

weixin_44629054的博客 115

死锁检测组件的设计

死锁检测组件实现摘要 本文介绍了一个基于图算法的死锁检测组件实现方案。该组件通过hook技术拦截pthread_mutex_lock/unlock和pthread_create调用,动态构建线程等待图,并周期性检测环路来发现死锁。核心设计包括: 使用邻接表存储线程等待关系图 维护锁-线程持有关系表 通过hook函数在加锁/解锁时更新等待图 独立检测线程定期执行DFS搜索环路。

qq_57951250的博客 528
上一篇: Java中String为什么是Immutable的
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值