如何写一段死锁代码

如何写一段死锁代码

Intro

上次介绍了如何写一段代码造成 StackOverflow ,今天来玩一下,看如何写一段代码造成死锁

什么是死锁

首先我们需要明确一下什么是死锁,造成死锁需要满足哪些条件,知道这些就可以轻松写出一段死锁代码了

死锁 是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁 状态或系统产生了死锁,这些永远在互相等待的进程称为死锁 进程(线程)。  ---- 百度百科

产生死锁的必要条件:

  1. 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。

  2. 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。

  3. 不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。

  4. 环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。

预防死锁方法:

  • 资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)

  • 只要有一个资源得不到分配,也不给这个进程(线程)分配其他的资源:(破坏请保持条件)

  • 可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)

  • 资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)

.NET 中的死锁

通常的死锁的示例都是两个锁,多个资源导致的死锁,你有没有想过一个资源也会导致死锁,如何使用一个锁造成死锁呢?思考一下再看下面的代码

private static readonly object Lock = new object();public static void Test()
{lock (Lock){Task.Run(TestMethod1).Wait();}
}private static void TestMethod1()
{lock (Lock){Console.WriteLine("xxx");}
}

Test 这个方法中首先获取锁,获取锁成功之后调用另外一个线程去调用 TestMethod1 方法,而 TestMethod1 方法中会再次尝试获取锁,此时因为锁已经被 Test 方法获取而且并没有释放,所以会一直获取不到锁从而造成死锁

其实这种情况还有很多变形,比如说 lock(this)/lock("lockedString") 这种都是比较危险的,所以不推荐使用,我们使用上面的示例做一个变形,使用 lock("lockedString") 来测试一下

public static void Test()
{lock ("Lock"){Task.Run(TestMethod1).Wait();}
}private static void TestMethod1()
{lock ("Lock"){Console.WriteLine("xxx");}
}

这样也会造成死锁,因为 lock 的 string 实际上是同一个引用,字符串池(string intern),所以类似于上面的示例,相当于是一个锁,对于 lock(this) 也是类似的,所以通常 lock 是不推荐 lock(this)/lock("string") 这些写法的,对于不同的资源要使用不同的 lock,这样就可以避免上面这个示例的这种情况

More

使用锁的一些注意事项:

  1. 锁要用来锁定对应的访问资源,不同的资源使用不同的锁来访问限制

  2. 锁尽可能使用这样的格式 private readonly object _locker = new object();,是否使用 static 根据需要添加,多个资源有关联时,小心死锁的情况,一次全部分配,任意一个资源分配失败释放另外一个锁以避免死锁

  3. 实现分布式锁的时候指定最大尝试时间,避免死锁避免长时间获取不到锁影响系统性能

在 SQL Server 中会有一个独立的死锁检测的进程,如果发生死锁的情况,会有一个事务会被选择为牺牲品来解决死锁的问题

在通过 Redis 实现分布式锁的时候,通常会指定一个锁的过期时间,过期时间通常是为了避免获取锁成功的系统突然宕机导致锁一直在锁定状态,从而导致其他服务获取锁的时候一直获取失败,除此之外,通常还会指定一个最大等待时间,如果别的服务获取到锁了,正在操作,那么会等待锁释放,但是为了避免死锁,如果长时间获取不到锁的话就会放弃获取锁,直接返回获取锁失败。

除此之外你还了解哪些使用锁的注意事项和避免死锁的常用方法呢,欢迎补充,如果文中有误,欢迎指出,万分感谢。

Reference

  • https://baike.baidu.com/item/死锁/2196938

  • https://blog.csdn.net/hd12370/article/details/82814348

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/StupidSamples/DeadLockSample.cs

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

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

相关文章

121. 买卖股票的最佳时机

一:题目 二:上码 class Solution {// public int maxProfit(int[] prices) {// int max 0;// for (int i 0; i < prices.length; i) {// //求出i后面的最大值// int temp 0;// for (int j i 1; j < prices.length; j) {// …

IdentityServer4系列 | 快速搭建简易项目

一 、前言从上一篇关于 常见术语说明中&#xff0c;主要是对「IdentityServer4」的说明&#xff0c;以及其中涉及常见的术语的表述说明&#xff0c;包括对身份认证服务器、用户、客户端、资源以及各个令牌等进行对比区别说明。而在这一篇中&#xff0c;我们将尝试通过简单的方式…

136. 只出现一次的数字(hot100)

一:题目 二:上码 class Solution {public int singleNumber(int[] nums) {int ans -100;Arrays.sort(nums);for (int i 0; i < nums.length-1; i2) {if (nums[i] ! nums [i1]) {ans nums[i];break;}}return ans -100 ? nums[nums.length-1] : ans;} }

高并发项目Java是标配?.NET Core要将它拉下“神坛”!

电商的秒杀和抢购&#xff0c;对我们来说&#xff0c;都不是一个陌生的东西。然而&#xff0c;从技术的角度来说&#xff0c;这对于Web系统是一个巨大的考验。当一个Web系统&#xff0c;在一秒钟内收到数以万计甚至更多请求时&#xff0c;系统的优化和稳定至关重要。缓存技术是…

141. 环形链表(hot100)

一:题目 二:上码 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {public boolean hasCycle(ListNode head) {ListNode fa…

程序员修神之路--分布式系统使用网关到底是好还是坏?

“灵魂拷问分布式系统需要统一的网关吗&#xff1f;网关会带来哪些优势&#xff1f;引入网关会带来灾难吗&#xff1f;分布式系统的设计大体上分为中心化和非中心化&#xff0c;像现在流行的微服务模式&#xff0c;本质上是把各种业务拆分为独立的进程来实现业务的扩展性。伴随…

160. 相交链表(hot100)

一:题目 二:上码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListN…

.NET Core开源任务调度平台ScheduleMaster上新了

ScheduleMaster上一次比较大的更新还是在6月份&#xff0c;转眼已经快过去4个月了&#xff0c;这段时间比较忙&#xff0c;中间只更新过一次修复了几个小bug。要总结这次更新的话&#xff0c;必须要用“千呼万唤始出来”了&#xff0c;因为这次不仅经历的时间比较久&#xff0c…

234. 回文链表(hot100)

一:题目 二:上码 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ …

T-SQL | 逻辑查询处理内幕学习

【T-SQL】| 作者 / Edison Zhou这是EdisonTalk的第296篇学习分享T-SQL是ANSI和ISO SQL标准的MS SQL扩展&#xff0c;其正式名称为Transact-SQL&#xff0c;但一般程序员都称其为T-SQL。本文是我学习《T-SQL查询》一书的读书笔记&#xff0c;为你讲解逻辑查询的内幕。1逻辑查询处…

461. 汉明距离(详解)

一:题目 二:上码 class Solution {/**在信息论中&#xff0c;两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数换句话说就是将字符串转换成另一个字符串需要替换的字符的个数*/public int hammingDistance(int x, int y) {int count 0;if (x y) return 0;…

在 Azure 上给我的博客配置负载均衡

点击上方蓝字关注“汪宇杰博客”导语前阵有美国读者嘲讽我的博客在美国地区页面加载速度太慢&#xff0c;还好意思写性能优化的文章。为了让美国朋友们闭嘴&#xff0c;并不给中国人丢脸&#xff0c;我使用了钞能力&#xff0c;在 Azure 国际版上给我的博客部署了一个美国地区的…

543. 二叉树的直径(详解)

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

C#实现乞丐版IOC容器

一、前言netcore中的容器非常好用&#xff0c;今天我们自己来简单实现一个。实现容器的核心接口有两个&#xff1a;IServiceCollection、IServiceProvider。其中IServiceCollection定义容器集合&#xff0c;IServiceProvider提供容器中对象的访问。话不多说&#xff0c;直接编码…

leetcode hot100.2. 两数相加(详解)

一:题目 二:上码 // /** // * Definition for singly-linked list. // * public class ListNode { // * int val; // * ListNode next; // * ListNode() {} // * ListNode(int val) { this.val val; } // * ListNode(int val, ListNode next) { t…

COSCon‘20 参会指南 | 你想知道的都在这里(文末有福利)

中国开源年会 COSCon20&#xff0c;本周末你准备好了吗业界最具影响力的开源年度盛会2020中国开源年会 (COSCon20) 将于 10月24-25日由开源社举办。本次大会较往年出现了许多新变化&#xff0c;您可能有许多问题&#xff0c;为了让大家尽快参与其中&#xff0c;小编在这里为大家…

leetcode647. 回文子串(动态规划)

一:题目 二:上码 class Solution {/**思路:1.确定dp数组dp[i][j]:表示的是区间范围内[i,j]的字符串是否是回文串 2.确定dp数组递推公式1>:如果s[i] ! s[j] 那就是false2>:如果s[i] s[j] 如果 i - j < 1 那么的话 dp[i][j] 就为true如果 i - j > 1 的话 那就要看…

搬砖的八种境界

这一点文字&#xff0c;纯属有感而发。世上的道路千万条&#xff0c;搬砖的队伍更是前仆后继&#xff0c;延绵不绝。我总结有八种境界&#xff0c;请各位看官对号入座&#xff0c;不要客气。不知道怎么搬砖。职业早期&#xff0c;无可厚非。但如果长期处于这个阶段&#xff0c;…

芯片项目谁支持谁负责 重大损失将予以通报

随着全国掀起半导体热&#xff0c;全国各地都在大力投资&#xff0c;其中不乏浑水摸鱼的存在&#xff0c;在江苏、四川、湖北、贵州已经有多个半导体大项目先后停摆。在南京&#xff0c;号称投资30亿美元的德科码已经烂尾。在淮安&#xff0c;规划总投资450亿元的德淮半导体烂尾…

leetcode5. 最长回文子串

一:题目 二:上码 class Solution {/**思路:1.确定dp数组2.确定dp数组的递推公式s[i] ! s[j] 那么dp[i][j] 肯定为falses[i] s[j] 那么的话 i - j < 1 为true ans max(ans,i-j 1);i - j > 1的话 那么dp[i1][j-1] true的话那么dp[i][j] trueans max(ans,i-j1);3.确定…