如何避免死锁

什么是死锁,如何避免死锁?
     线程A需要资源X,而线程B需要资源Y,而双方都掌握有对方所要的资源,这种情况称为死锁(deadlock),或死亡拥抱(the deadly embrace)。

在并发程序设计中,死锁 (deadlock) 是一种十分常见的逻辑错误。通过采用正确的编程方式,死锁的发生不难避免。

死锁的四个必要条件

------------------------------

在计算机专业的本科教材中,通常都会介绍死锁的四个必要条件。这四个条件缺一不可,或者说只要破坏了其中任何一个条件,死锁就不可能发生。我们来复习一下,这四个条件是:

  1. 互斥(Mutual exclusion):存在这样一种资源,它在某个时刻只能被分配给一个执行绪(也称为线程)使用;
  2. 持有(Hold and wait):当请求的资源已被占用从而导致执行绪阻塞时,资源占用者不但无需释放该资源,而且还可以继续请求更多资源;
  3. 不可剥夺(No preemption):执行绪获得到的互斥资源不可被强行剥夺,换句话说,只有资源占用者自己才能释放资源;
  4. 环形等待(Circular wait):若干执行绪以不同的次序获取互斥资源,从而形成环形等待的局面,想象在由多个执行绪组成的环形链中,每个执行绪都在等待下一个执行绪释放它持有的资源。

解除死锁的必要条件

不难看出,在死锁的四个必要条件中,第二、三和四项条件比较容易消除。通过引入事务机制,往往可以消除第二、三两项条件,方法是将所有上锁操作均作为事务对待,一旦开始上锁,即确保全部操作均可回退,同时通过锁管理器检测死锁,并剥夺资源(回退事务)。这种做法有时会造成较大开销,而且也需要对上锁模式进行较多改动。

消除第四项条件是比较容易且代价较低的办法。具体来说这种方法约定:上锁的顺序必须一致。具体来说,我们人为地给锁指定一种类似“水位”的方向性属性。无论已持有任何锁,该执行绪所有的上锁操作,必须按照一致的先后顺序从低到高(或从高到低)进行,且在一个系统中,只允许使用一种先后次序。

请注意,放锁的顺序并不会导致死锁。也就是说,尽管按照 锁A, 锁B, 放A, 放B 这样的顺序来进行锁操作看上去有些怪异,但是只要大家都按先A后B的顺序上锁,便不会导致死锁。

解决方法:

1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务; (细化处理逻辑,执行一段逻辑后便回滚或者提交,然后再执行其它逻辑,直到事物执行完毕提交)
2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;
3 优化程序,检查并避免死锁现象出现;
4 .对所有的脚本和SP都要仔细测试,在正是版本之前。
5 所有的SP都要有错误处理(通过@error)
6 一般不要修改SQL SERVER事务的默认级别。不推荐强行加锁

另外参考的解决方法:

按同一顺序访问对象
    如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。例如,如果两个并发事务获得 Supplier 表上的锁,然后获得 Part 表上的锁,则在其中一个事务完成之前,另一个事务被阻塞在 Supplier 表上。第一个事务提交或回滚后,第二个事务继续进行。不发生死锁。将存储过程用于所有的数据修改可以标准化访问对象的顺序。

   
    避免事务中的用户交互
    避免编写包含用户交互的事务,因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,例如答复应用程序请求参数的提示。例如,如果事务正在等待用户输入,而用户去吃午餐了或者甚至回家过周末了,则用户将此事务挂起使之不能完成。这样将降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。
   
    保持事务简短并在一个批处理中
    在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。事务运行时间越长,其持有排它锁或更新锁的时间也就越长,从而堵塞了其它活动并可能导致死锁。保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。
   
    使用低隔离级别
    确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取(未修改)的数据,而不必等待第一个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间,从而降低了锁定争夺。
   
    使用绑定连接
    使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合作。次级连接所获得的任何锁可以象由主连接获得的锁那样持有,反之亦然,因此不会相互阻塞。

转载于:https://www.cnblogs.com/cxd4321/archive/2012/05/28/2521542.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 数组增加,java-添加视图数组会使android应用崩溃

我在这里有一个android应用程序的某些部分,没有明显的原因而崩溃.RL0恰好是用XML定义的一些LinearLayout,其中已经包含一些其他不相关的内容.老实说,我大部分时间都在使用C,所以我最初可能不太了解为什么在android中某些事情做的明显不同,但是我正在努力.关于如何解决该崩溃的任…

Android 编码规范:(六)消除过期的对象引用

尽管Java不像C/C那样需要手工管理内存资源,而是通过更为方便、更为智能的垃圾回收机制来帮助开发者清理过期的资源。即便如此,内存泄露问题仍然会发生在你的程序中,只是和C/C相比,Java中内存泄露更加隐匿,更加难以发现…

android 歌曲剪辑 原理,在Android上,我该如何制作怪异的剪辑区域?

Path path new Path();path.addCircle(200,200,100,Direction.CW);c.clipPath(path); // c is a Canvas现在有上防止绘制圆的边界之外的任何画布剪切区域。但是,如果我想让裁剪区域的形状像甜甜圈(或其他)呢?我试着玩弄创建第二个路径并在其上使用toggl…

初始化toolstrip

/// <summary>/// 初始化工具条/// </summary>private void InitializeToolbar(){Image img global::Win.Properties.Resources.mainfram;//240 15int heigh 15;int width 16;for (int i 0; i < 15; i){Bitmap bitmap new Bitmap(16, 15, System.Drawing.I…

html 鼠标图标做成动画效果,纯css3实现的鼠标悬停动画按钮

今天给大家带来一款纯css3实现的鼠标悬停动画按钮。这款按钮鼠标经过前以正方形的形式&#xff0c;当鼠标经过的时候以动画的形式变成圆形。效果图如下&#xff1a;实现的代码。html代码&#xff1a;复制代码代码如下:css3代码&#xff1a;复制代码代码如下:body{background-co…

联想乐Pad_A1获取root权限

1、下载root包&#xff1a;参考http://bbs.anzhi.com/thread-4786308-1-1.html 里面的root包&#xff0c;共两个&#xff0c;到电脑。2、将tf卡&#xff0c;置入平板电脑&#xff0c;通过大存储方式连接电脑&#xff0c;以fat或者fat32方式将tf卡格式化&#xff0c;然后将下载的…

html表单不允许修改,[问题]如何在表单里定义(form)仅仅可读,不可修改的列?

经过我不懈努力的寻找及测试&#xff0c;现在有一个解决方案可以解决typeform表单里设置只读字段。只需要覆写columns中的renderFormItem字段即可。下面以设置用户名只读为例&#xff1a;pro-table版本&#xff1a;"ant-design/pro-table": "^2.9.16"colum…

ASP.NET多线程编程(一) 收藏

Thread的使用using System;using System.Threading;public class ThreadExample {public static void ThreadProc() {for (int i 0; i < 10; i) {Console.WriteLine("ThreadProc: {0}", i);Thread.Sleep(0);}}public static void Main() {Console.WriteLine(&quo…

html如何查看文档,查看文档

设计步骤(返回正文)一、绘制表格1、在手动设计Html模板之前&#xff0c;我们先需要一个模板的样式&#xff0c;这个样式我们可以拿原来的纸质的样式&#xff0c;也可以在Excel表格中画一个样式&#xff0c;如图1所示&#xff0c;我们后面的设计都要根据这个表格来进行设计。图1…

父亲的忠告:把孩子培养成普通人

现在你用不到&#xff0c;将来你肯定用的到。你一定会做个好爸爸。 转自&#xff1a;http://luo.bo/25512/转载于:https://www.cnblogs.com/webcc/archive/2012/06/01/2531207.html

U盘装XP系统(含截图,2012最新原创超简单方法)

U盘装XP系统(含截图&#xff0c;2012最新原创超简单方法)首先准备好3样必备东西 1.U盘2.XP系统&#xff08;推荐GhostXP SP3 2012统一论坛最新版&#xff1b;迅雷快传下载地址&#xff1a;http://kuai.xunlei.com/d/BMLHLZHXVGKT&#xff09;3.制作U盘WINPE软件(推荐UltraISO&a…

2021年峰峰春晖中学高考成绩查询,峰峰春晖中学2019年录取分数线

技校网专门为您推荐的类似问题答案问题1&#xff1a;河北丰润车轴山中学2011年录取分数线按学校名次录取问题2&#xff1a;广州美术中学2011年中考录取分数线提前批优先线为693分&#xff0c;比往年略高。公费线640分&#xff0c;择校、民办线为620分。问题3&#xff1a;2009年…

推到重做

自己做到太差了&#xff0c;完全是在1.16的基础上进行了少量的修改&#xff0c;和自己当初的想法完全不一样&#xff0c;推到重新做&#xff01;&#xff01;&#xff01; 先找下思路&#xff0c;复习下自己的系统以及uboot烧写过程。 自带Uboot烧写过程 硬件检测结果&#xff…

广东省2021年普通高考成绩复查结果查询,广东省2021年普通高考英语听说考试成绩可以查询啦!...

广东省2021年普通高考英语听说考试评卷工作已经结束。现将考试成绩发布的有关事项通知如下。一、考试成绩发布广东省2021年普通高考英语听说考试成绩将于4月28日统一发布。高考英语听说考试成绩按考生卷面成绩(满分60分)3&#xff0c;四舍五入取整数后计得。英语听说考试成绩与…

c#完美截断字符串(中文+非中文)

public static string Truncation(this HtmlHelper htmlHelper, string str, int len){if (str null || str.Length 0 || len < 0){return string.Empty;}int l str.Length;#region 计算长度int clen 0;while (clen < len && clen < l){//每遇到一个中文&…

2021辽宁大洼高中高考成绩查询,2021大洼高中最后一跑——励志高考,逆袭人生...

六月的天&#xff0c;湛蓝六月的风&#xff0c;不燥六月的日子&#xff0c;激情四溢六月里的故事&#xff0c;总是以青春为主题六月里的大洼高中高三学子们迎来了人生重要的里程碑——高考2021年6月5日&#xff0c;是大洼高中高三学子们热情饱满准备出征高考、逆袭人生的日子。…

jQuery ajax 和 普通js ajax 笔记

首先引用 两个js 文件 1 <script src"js/jquery-1.7.1.js" type"text/javascript"></script> 2 <script src"js/Common.js" type"text/javascript"></script> html 代码&#xff1a; 1 <body> 2 …

html 在手机上运行,怎么在手机上打开HTML

回答&#xff1a;一1、我们打开XMind软件2、点击插入----超链接3、我们输入我们的网址二使用二&#xff1a;XMind如何分享&#xff0c;XMind提供非常强大的共享功能&#xff0c;而且在不断完善&#xff0c;那么大家知道XMind如何分享吗&#xff1f;其实操作还是简单的。1、我们…

attribute 扩展

今天参考json-c的源码 读到一个关于attribute 扩展 static void json_object_init(void) __attribute__ ((constructor)); static void json_object_fini(void) __attribute__ ((destructor)); google到含义如下 void main_enter() __attribute__((constructor));//main_enter函…