如果面试官问你要怎么避免死索,你知道怎么回答吗?这个视频你一看就懂,那首先解释一下死索是什么?死索是在多县城环境下面发生的一个问题,那当两个或者多个县城在互相等待对方释放资源,陷入一个永久等待的状态,那么这个情况就是死索。我们来看一下这个例子, 假设我们有两把锁,锁 a 和锁 b, 我们有两个线程,线程 a 和线程 b, 这两个线程都想要同时获得锁 a 和锁 b, 那么他们的请求顺序是什么样子的呢?线程 a 首先获得了锁 a, 而现成 b 首先获得锁 b, 这个时候没有问题,现在问题来了,这个时候现成 a 想去获得锁 b, 而现成 b 又想要获得锁 a, 但是这个时候这两把锁其实是被对方现成所占有的,那么这个时候双方陷入了无尽的等待,那么死锁也就产生了。那么我们在扎法当中看下这个这个问题。 首先我们声明了两个 object 对象来分别作为锁 a 和锁 b, 那么可以看到线程 a 的申请顺序是先申请锁 a, 然后再是申请锁 b, 而线程 b 的顺序是先申请锁 b, 再申请锁 a, 那么这个情况就会导致我们刚刚所说的死锁的情况。我们可以去主程序下来来运行一下这个这段代码, 可以发现线程 a 只获取到了锁 a, 而线程 b 只获取到了锁 b, 然后这个代码就陷入了死锁的状态,需要我们来手动的去终止一下这个程序。那么要产生死锁的话呢,也是需要满足一些条件的,首先第一个互持条件, 什么意思呢?也就是资源是不能同时被多个县城占用的。第二个是占有且等待条件,也就是说一个县城在占有资源的同时呢,他还在等待其他的资源。好第三点是不可抢占条件,也就是一个资源是不能被另外一个县城强行占用的。最后 第四点是循环等待条件,也就是存在一组线程,他们之间形成了一个资源等待的环路,让他们来无穷无尽的循环等待下去。那我们要如何去避免思索呢?我们可以试着从这四个必要条件当中入手,去破坏其中的一个条件。那比如说我们可以来通过设计算法来让线程有序的去获取所, 那么这个其实就是破坏了其中的循环等待条件,又或者说我们可以在发生死锁的情况下,来强制的让其中某一个线程去释放掉他的资源,那么这样其实就破坏了不可占用条件。针对这个方法我们再来举个例子,那现在我们回到了刚刚死锁的这个状态,这个时候我们的线程 a 识别到了死锁的情况, 那么这个时候他要做什么?他会主动的去停止对锁 b 的请求,并且会把他所占有的锁 a 给释放掉,放回去。那这个时候呢,陈 b 就拥有了 得到索 a 的权限,线程 b 同时得到了索 a 和索 b, 那么这个时候程序中的死索得到了解决,也就是可以继续顺利的运行下去了。而当线程 b 的任务完成之后,他会将索 a 和索 b 分别释放,这样之后呢,这两把锁可以被其余的线程继续获取,我们来继续看一下在扎法当中我们是怎么实现这个逻辑的, 我们可以使用 reaction slog 这个类,那为什么要使用这个类呢?是因为我们依赖这个类的 trylove 方法,可以看到这个 trylove 方法是接受一对参数的,我们可以将它指定为你想要的时间,那么在你设定的这个时间内呢?你的线程会去持续的对这个锁进行一个持续的申请, 他返回的是一个不尔值,当你成功的获取到你想要的资源的时候,他会返回处,而当超过你所设置的时间之后,你依旧不能获取你想要的资源的话,他就会返回 boss。 那么这段代码是他是如何来帮我们避免思索的呢?可以看一下依旧 就是刚刚那两个线程,线程 a 和线程 b, 他们请求锁的顺序也是相同的,线程 a 先请求锁 a, 而线程 b 先请求锁 b, 那么唯一的区别是,当线程 a 在申请锁 b 的时候, 他设置了一个一秒的等待时间,当他在一秒之后依旧不能得到锁闭的时候,他会主动的返回 pos, 停止对锁闭的请求,然后跳出了这段踹代码快,然后他会主动的去释放锁 a, 而当他释放了锁 a 之后, 我们可以看到线程 b 这边其实是设置了一个五秒的等待时间,那么在这五秒之内,他就可以顺利的获得刚刚线程 a 所释放掉的索 a, 从而让程序顺利的进行下去。当他完成了对应的代码逻辑之后呢,他就可以 主动的释放索 a, 其次是他的索 b, 那么代码到这里就顺利的结束了,那么思索 就被这样成功的解决了,我们还是回到主程序下来运行一下这段代码,可以看到还是同样的线程 a 首先获得取到了索 a, 线程 b 获取到了锁 b, 那么当线程 a 识别到这个情况之后呢?他会主动的把索 a 释放掉, 接下来你就会看到锁 b 在这个时候获取到了锁 a, 以此来保证程序可以顺利的进行,那么通过刚刚我所说的方法,你就可以成功的避免思索的发生。如果你觉得这个视频对你有帮助的话,记得点赞、关注加评论,我们下个视频见。
粉丝455获赞2990

数据库产生思索的话呢,还是很严重的啊,虽然说锁的只是个别的记录,但是你的数据库连接是有限的, 如果数据库连接一直得不到释放,事物长时间占用着这个数据库连接啊,然后呢接口又一直在请求中,就会导致接口的信号链呀,连接时会很快的被占满,得不到释放,然后你的 a、 p i 很快就会出现这个超时的情况, 整个的中心接着就会挂掉,如果中心又没有做熔断的话呢,可能会拖垮整个的服务。所以很多公司呢,都会出台很多的机制啊,包括一些这个代码的规范啊,来防范思索的发生。 那么思索怎么产生的呢?网上有很多说法,我觉得总结下来就一条,就是不同的事物之间发生了循环依赖,比如说事物 a 跟事务 b 呢,分别占用了资源 x 跟资源 y, 当 a 试图请求 y 的时候呢,事务 b 呢却又占用了 y, 这个时候呢, a 就会被阻塞。同样的,当 b 试图请求 x, 而 a 又占用了 x 的时候呢, b 也会被阻塞, 这个时候呢, a 跟 b 都无法继续执行,就形成了一个思索。但是这一块不仅仅是两个事物之间的事情啊啊,也有可能是多个事物之间变成了一种循环依赖,这个时候呢,就发生了数据库的思索。 比较常见的场景呢,就是相互转账了啊,比如说 a 转账给 b 对吧, b 又转账给 a, 那么 ab 两个人的账户呢,其实都会被两个县城分别锁定,如果不加处理的话呢,他们就会相互请求对方占用的资源,继而呢就发生了思索。在这个场景 中啊,比较常见的解决方案就是加上丰富之所保证, ab 之间的转账业务呢,只能有一个县城在处理,这种方式呢,就比较简单粗暴了,但是呢,确实很有效果,可能呢会有小伙伴会吐槽啊,效率太低,因为所有的县城呢,就变成了一个创新化的处理。 所以呢,就来了另外一种处理方式啊,就是规定线程枷锁的顺序要一致啊,比如说我先锁定 a 的账户,然后呢再锁定 b 的账户,这样的话呢,所有的请求呢,都会先按照先 a 后 b 的顺序进行,枷锁自然而然呢,就没有思索的发生了。 那么除了上面两种方式呢,优化 soco 语句和缩影呢,也可以减少对同一数据行的竞争,毕竟呢枷锁尽量呃加在行锁上呢, 他的范围就会缩减了,自然呢就能够降低思索的概率了。当然呢,大多数数据库呢,也会提供思索的检测和超值机制啊,当发现思索时呢,数据库呢,会自动回滚其中一个事物来释放资源, 避免了思索的进一步扩大。而超时机制呢,则可以在一定的时间内主动结束事物来释放资源,避免思索的长时间持续,也能够提高呢数据库的变化性能。好了,本期的视频呢,就是这些了,如果您对本期的内容呢,有任何疑问,欢迎大家在评论区给我留言,谢谢大家!

一个去阿里面试的小伙伴私信我,他说今天被一个死锁的问题给难到了,平时我都特意看了死锁这块的内容,但是回答说就是想不起来。 这里大家会存在一个误区,认为技术是需要靠背的,大家可以想一想啊,平时写代码的时候这些代码是背下来的吗?遇到一个需求的时候能够立刻去提供解决思路,这个难道也是记下来的吗?其实啊,所有的技术问题都可以用一个问题来解决,就是当你遇到这个问题的时候你会怎么去设计, 如果你面对这个问题是一片空白,说明你目前掌握的技术只能足够支撑你去写 ciud 的能力。好了,那看一下对于这个问题呢,我们看看普通人和高手是如何回答的呢?普通的回答, 十所,嗯,呃,十所应该是并发里面,就并发 编程里面,如果我是用了新款 nice 的同步锁的情况下,就有可能出现的一个问题,嗯,导致实所问题的情况应该是说我可能 嗯 a 这个县城已经持有了某个所资源,然后又去抢占其他县城的这个叫其他的这个所资源,然后,嗯,其他县城也持有了我, 就是就是我,反正就是我相互去抢占,就相互持有了这个资所资源,并且相互去抢占,这样一个情况啊,就会形成这样的一个循环等待造成的一个失所。 嗯,至于十所的解决方法的话不是很记得。嗯,高手的回答,十所啊,简单来说就是两个或者两个以上的县城 在执行的过程中去争夺同样一个共享资源造成的相互等待的一个现象,如果没有外部的干预呢?县城会一直阻塞,无法往下去执行。这样一直处于相互等待资源的县城,我们称为十所县城。 导致死锁的条件有四个,也就是说这四个条件同时满足,就会产生死锁。第一个护士条件,共享资源 x 和 y 只能被一个现成占用。 第二个是请求和保持条件,县城第一,如果已经取得了共享资源 x, 在等待共享资源外的时候,不释放共享资源 x。 第三个是不可抢占条件,就说其他县城不能强行去抢占县城第一占有的资源。 第四个循环等待条件,县城 t 一等待县城 t 二战友的资源,县城 t 二等待县城 t 一战友的资源,这个就叫循环。等 导致死锁之后呢,只能通过人工干预来解决,比如说重启服务或者替尔掉这个县城, 所以我们只能在写代码的时候去规避可能出现的死锁问题。而按照死锁发生的四个条件,我们只需要破坏其中的任何一种就可以去解决它。但是护士条件是没有办法被破坏的,因为它是护士所的基本约束,而其他的三个条件都有办法来破坏。 比如说对于请求和保持这个条件,我们可以一次性申请所有的资源,这样的话就不存在所有的等待了。第二个,对于不可抢占这个条件,占用部分资源的县城,在进一步申请其他资源的时候,如果申请不到, 我们可以主动去释放他占有的资源,这样不可抢占这个条件就会被破坏掉了。第三个,对于循环等待这个条件,可以按序申请资源来预防,所谓按序申请啊, 就是指啊,资源是有线性顺序的,申请的时候可以先申请资源的序号小的,然后再去申请资源序号大的,这样线性化之后呢,自然就不存在循环了。以上就是我对这个问题的理解, 发现了吗?当大家理解了时所发生的条件,那么对于这个条件的破坏,是可以通过自己技术的积累来设计解决方案的,所有的这些技术思维和技术架构都是由人来设计的, 为什么别人能够设计,本质上还是技术积累之后的结果。其实有个发现啊,越是底层的设计,对于知识面的掌握和要求就越多。好的,本期的普通人 vs 高手的面试系列视频就到这结束了,喜欢的朋友记得点赞和收藏。我是 mike, 一个工作了十四年的骄傲程序员,咱们下期再见!

这个视频我们聊一聊关于思索的一个问题。首先,我们举个生活中比较常见的例子。由于今年疫情比较严重,为了让大家少出门,于是成龙修改了规则,只在地球上留下了两颗龙珠, a 星球和 b 星球,只要集齐这两颗龙珠就能召唤神龙。此时悟空拿到了 a 星球,而弗雷萨拿到了 b 星球, 然而需要两颗才能许愿。因此,悟空拿着 a 星球的同时,又在等待着弗雷萨放弃 b 星球,同样,弗雷萨也等待着悟空放弃 a 星球,这样就形成了一个死索。很明显,产生死索必须要满足四个条件,第一个,呼哧使用, 即当资源被一个县城使用时,别的县城不能使用。第二,不可占占资源请求者不能强制从资源占有者手中夺取资源。第三呢,占有且等待,即当资源请求者在请求其他资源的同时,保持对原有资源的占有。第四,循环等待,即县城一等待县城二占有的资源,而县城二要等待县城一占有的资源, 形成一个环路。由于程序中产生死锁是非常可怕的,因此我们必须做好提前的预防死锁,只有这四个条件都发生时才有可能出现。也就是说,我们只要破坏其中一个,就可以成功的预防死锁的发生。一般我们不会对后置条件进行破坏,因为某些资源就只能一个人使用,不能同时多人使用,例如打印机。 因此,我们主要对其他三个条件进行破坏。破坏战友,且等待每个请求者一次性申请所有需要的资源。如果无法一次性申请所有的资源,那就进行等待, 包含不可抢占。当某个县城拿到一部分资源之后,又去申请另一个资源时,如果申请不到,便会主动释放他占有的所有资源, 破坏循环等待。我们可以给每个资源都标上一个序号,按序申请,先申请资源,序号小的再申请资源,序号大的,这样现行化后申请资源,我们就不会存在一个循环等待的问题,避免。似乎还有著名的银行加速 算法,有兴趣的小伙伴可以随意去了解一下。讲了那么多,我们可以尝试的去写一个思索,首先我们试着写一个思索,接下来要产生思索,必须满足我们刚刚讲的那四个条件。所以我们先来创建两个资源, 这个资源叫 b, 找两个资源之后,我们再启动两个现场, 然后我们让第一个线程先拿到 a, 说出一句话,那第二线程先拿到 a, 拿到 a 之后呢?我们让他抱着这个资源睡,睡一个差不多两秒的时间,你确保第二个资源可以先拿到我们的 b 资源, 嗯,买它之后睡篮板之后,我们让他拿去拿 bz got b, 嗯,这里再加一句话, want get b, 你看这里前面再加上一个现场的名字, 这里加一下, ok。 然后第一个线程我们已经写好,第二个线程其实跟第一个线程是一样的,我们来复制一下整个第二线程,他先拿到 b 资源,拿到 b 资源之后, 先拿到 b 资源,然后抱着 b 资源睡两秒钟,然后呢,再让他去拿 a 资源。 好,我们启动一下, 可以看到县城零拿到了我们的 a 子元,县城一拿到了 b 子元,然后县城零等待着去拿 b 子元,而县城一等待拿 a 子元产生了一个思索,我们还可以通过 justifi 的命令来查看我们的一个思索的情况。首先我们先获取到我们的 个 id 号是八幺二零,然后没有通过这三个方式来查看死锁的位置,看,这已经提示了找到一处死锁,我们来看一下线程一,线程一在等待着去锁,等待了这个锁,一个四 d 零的一个锁, 同时他已经锁住了一个四亿零的锁,而他跟县城零刚好相反,他等待着一个四亿零的锁,然后锁住了四 d 零。位置发生在第三十六号,也就是我们代码当中的三十六号和二十号,刚好就是锁的这个位置。

然后时所产生的必要条件。时所产生的必要条件。大概也就是一旦满足下面这几个条件,他就会产生时所来。我们看一定要同时满足啊,一定要同时满足这四个条件才能产生时所。那么,嗯, 只要其中一个条件不成立,那么死锁就不会发生。所以我们来看什么叫互刺,一定要互刺。因为只有在互刺,哲学家问题都是互刺的问题。所以在讨论互刺访问资源的时候,才会出现死锁,对吧?才会出现死锁。第二个叫不剥不剥夺条件。进程获得资源在于主动释放,而不是在于抢。 如果抢的话,还存在什么死锁啊,对不对?就是我需要,我在每个人都拿一根筷子都在等的时候,他就不等了,直接把隔壁抢过来,谁谁牛逼谁就谁,就先吃饭,对吧。如果有抢占抢占这个能力的话,那还怎么可能出现死锁呢?所以进程啊,获得资源,他不在于抢,而在于等待对方主动释放,才会出现死锁。第三 三个请求和保持条件。意思就是进程已经保持了至少一个资源,但又提出了新的请求,也就是说他保持了现有的资源,又发起了新的资源的请求, 对不对?然后此时进城被注射,但又对自己的资源保持不放,所以这才会产生我们的死锁。自己有了一部分临界资源,那么又在请求一些新的临界资源,那么这个时候他肯定是没有办法,对吧?没有没有,肯定会出现死锁的。 第四个是循环等待。一定要循环等待。若存在一种进程资源循环等待链,那么链中的每一个进程已经获得资源的同时,被下一个进程所请求。注意循环等待,你看他们是不是都在循环等待。等待其中任何一个人放下筷子,但是他们都不可能放下筷子,因为每个人就只有一根筷子,他吃不了饭,吃不了饭他就没办法释放资源。 注意发生死锁的时候,一定要有循环等待,但是发生循环等待的时候未必是死锁。举个例子,他们在循环等待,但是此 来了一个第六位哲学家,第六位哲学家给第三号哲学家发了一根筷子,那这时候这个循环是不是就被打破了?这个思索就这不叫思索,叫循环等待,就被打破了,对不对?所以 如果出现了死锁,他必然是循环等待的。但是在某一个时间节点的循环等待,不代表他就是死锁。这个时候来的最佳第六人是可能是可能打破这个问题的。快快点赞关注吧!

思索如何定位避免?哈喽,大家好,我是徐树,继续来给大家讲解高频面试题,如何快速的定位以及避免思索。那思索这概念呢,最早是出现在操作系统当中的,在我们句号当中呢,通常指的是现成的思索, 那一旦你的程序发生了现成死锁的话,我们在线上呢,通常是没有特别好的一个办法去应对的,你只能快速的去重启一下你的应用程序,因为如果你不重启的话,就会造成现成的一个堆积,最终导致 om 内存的一个溢出。所以说我们在日常开发当中呢,应该尽量的去避免死锁的发生,最好呢不要产生死锁。 那么如何才能避免死锁呢?以及出现了死锁,在线上如何快速的去定位解决呢?那徐老师来给大家讲一下,那什么是死锁呢?给大家总结一句话,就是在并发下现成,因为相互等待对方的一个资源,导致永久阻塞的这样的一个现象。关于这个问题的详细文字版,我已经整理了一份八十万字的专访秘书 笔记,放在视频的最后面,坚持看完一定对你有帮助。那为了让大家更好的去理解这句话,我给大家写了一个伪代码,那它的功能呢,就是转账,好吧,这里呢有两个账户,一个张三,一个李四,首先呢张三给李四去转五十块钱,李四呢给张三转五十块钱, ok, 那我创建了两个县城,好吧, 那么为了在转账的过程当中保证账户的一个行程安全呢,我们使用了同步锁,锁住了正在转账的这个账户, 那这个肯定要保证他的现场安全,对吧?因为假如说你在转账的过程当中又取钱的话,是不是会出现数据的一个混乱啊?对不对?所以说为了保证现场安全,我们要锁住正在转账的这个账户, 那么李四他的这个账户也是一样的,我们保证现场安全,同样的也要锁住。那么张三转给李四的这个县城呢?他为了保证李四的这个账户的 县城安全呢?同样的他也要锁住李四这个账户,对不对?那此时呢,他就要获取李四这个账户的资源,但是李四他此时是不是已经被这个县城锁住了呀?对吧? 那李四同样的他需要保证张三这个账户的现场安全,他也需要锁住张三,但是此时呢,张三同样的也被这个县城锁住了, ok, 那此时我们就会发现他们就出现了相互等待对方的一个资源,对吧?从而呢导致永久阻塞的这样的一个现象, 能明白,我给大家去运行一下这个代码,好吧,我在这个程序当中呢,呃,给大家运行看一下, ok, 好吧,一个张三,一个李四,然后创建了两个县城,他们呢去调用各自的一个转账方法,那么在这个转账方法当中呢,为了更好的去体现这个思索啊,我给他睡了两秒, 好吧,然后呢互相锁住对方的一个资源, ok, 来给大家运行一下。 好的,我们可以看到,此时呢输出了现成一的 begin, 现成二的 begin, 对吧?但是这个现成的 end 迟迟没有输出,说明什么?说明他们此时呢卡在了这里, 对不对?那这就是县城的一个思索啊,那如果出现在我们线上,我们如何才能快速的定位呢?其实要定位的话也很简单,我们可以打开我们的命令窗口,好吧,当然在 linux 它上面也是一样的去解决啊。首先我们查找一下我们当前这个程序的进程,答是七九四零零,然后结合 g stock 这个命令,打上你当前的这个进程 id 回车。那么此时呢,我们可以看到 fund one 带的 log 找到了一个思索,对不对?并且呢他也把哪两个县城进行思索的这个调用站给你展示出来了,并且从这个集成站当中呢,我们可以 快速的去进行定位,你看啊,他说发生在这个地方等待哪个对象,等待这样的一个对象,对吧?这是他内存的一个地址,这是 tr 这个县城等待这个资源,然后呢,他同时也锁住了这个资源, 然后 t 一呢,它等待这个资源,然后锁住了这个资源,我们会发现 t 二等待的这个资源它是被 t 一锁住的,对不对? t 一等待这个资源,它是被 t 二锁住的, 所以说这就出现了死锁的这样的一个情况,然后通过这里的这个现实账,我们就能够快速的去定位到底是哪一句代码出现的这个问题了。好吧,给他总结一下,你就是怎么样啊? 通过 gps 找到你当前这个程序的进程 id, 然后通过 gee stock 带上你进程 id 呢,去打印出当前正在死锁的这个线程, ok, 当然我们现在虽然知道怎么快速的去定位线上死锁的代码了,但是如何去解决,如何有效的去预防呢?我们不可能说为了解决死锁,我直接把这个等待资源的 把锁直接去掉,对吧?虽然这样死锁是解决了,但是会现成不安全啊,在高并发的一个情况下,我这里的转正金额肯定会出现数据错乱的,所以说我们如何能够保证现成安全的前提下再来解决死锁呢?那我们首先呢需要给大家去讲一下产生死锁的四大因素, 当出现了死锁呢,他会同时满足这四大因素,所以说我们只需要破坏其中的一个因素,就能有效的去解决并且预防死锁。 当然现在网上呢也有很多人去讲这个思索的,解决的这个方案也是基于这四大因素来讲的,但是讲的都非常的抽象啊,其实都是把这个念一遍,具体代码怎么实现,怎么落地,不知道对不对? 所以说徐硕老师呢,希望通过白话,然后再结合代码一个实战呢,带你们去掌握,好吧,那废话不多说,如果有帮助给老师一个三点支持,好吧。首先第一个互斥什么意思呢?就是共享资源只能被一个县城占有,其实就是在我们 代码当中的这个护制锁的一个体现,一定是在我们现实生活就是一个男的,他只能站着一个女朋友, ok, 这就是护制锁。 那第二个因素呢,就是占有且等待,这什么意思呢?就是县城当前至少占有一个资源,并且还想请求其他县城持有的资源,就会造成等待,那这个我们代码同样的也满足,对不对?就是我一个县城等待另外一个县城的资源,就比如说我 a 想要 b 的女朋友, 那必由于使用了物质呢,你必须在外面等待,对不对?那这个时候呢,就会造成占有且等待,这是第二点,第三点,不可抢占,什么意思呢?就是资源只能由只有他的这个县城自愿释放,其他的县城不可强行占有资源。 我们在代码当中使用的是 synchronite 去锁住这个资源,对吧?我被锁的这个资源呢,是无法由另外一个县城去通过代码去释放的,我们 gdk 根本就没有提供这样的代码,所以说不可能能够做到,对不对? 那在我们这个现实生活当中也是一样的,就比如说我 a 想要 b 的女朋友,就说 a 他除了有自己有一个女朋友啊,他还想要 b 的女朋友,但是 a 他不能要求 b 分手,只能由 b 这个现任呢去主动的去释放,就这意思,好吧。 然后呢,第四点,循环等待,也就是我除了 a 想要 b 的女朋友,我 b 呢还想要 a 的女朋友,所以这一出出现了一个循环等待,那在我们单马当中也是一样的,对吧?张三转账想要李四的锁,李四转账呢,想要张三的锁,出现了循环等待, 所以说当出现了思索呢,他会同时满足这四大条件,那我们只需要呢破坏某一个就能解决思索,那徐老师呢?带着你们逐个去破坏,那你在大马当中觉得你哪个适用呢?你就破坏哪一个,好吧,那首先是护翅, 我刚刚说了,体现护士就是护士锁,那你要不使用护士锁的话,你就得去结合你代码的一个业务以及这个功能了,对不对?就比如说我这里的这个代码非常的简单, 就是去计算一下这个账户金额,对不对?那我们比如说我能不能通过这个原子计算奥特曼一个 intake, 对不对?我们通过这个原子计算呢来进行操作,那么这样呢?他就不会有现成安全的问题,对不对?我直接通过原子操作, 这样是不是就 ok 了,对吧?这样呢就解决了现场安全的问题,那我只那我就不需要去锁那个等待的那个资源了,那这就解决了,思索。当然你还可以考虑,比如说能不能用这个 search logo 啊, 对吧?等等等等,比如说用,用这个 cs, 用乐观锁,能不能解决呢?对吧?所以说我们不使用护士锁,肯定呢就不会出现死锁的这样的一个情况, ok, 这是第一个破坏点, 那第二个破坏占有且等待。我们刚说了,一个男的,我除了自己有一个女朋友以外,我还想要其他的 这个男的女朋友,对不对?这就是占有且等待。那我能不能这样搞啊?我两个我都给他占了,我两个我都给他占了。就比如说你 a 不是想要 b 的女朋友吗?我给你占着,对吧? ok, 那你 b 呢?也想要这两个, 那我等你用完之后我再来用。那关键是我在代码当中怎么同时锁住两个字标呢?我们代码好像并没有提供这样的一功能,对不对?我不能说我在星空袋子里面还能同时锁两个吧?好像没有提供这样的功能,对不对?那我们可以通过变通的方式,好吧?来, 我什么意思呢?我给你加一个这个女朋友的,专门的这样的一个管理场所,好吧,我加一个管理场所, ok, 那这个管理场所啊,他只能同时的去服务一个县城,就比如说我 a, 我想要这两个资源,我同时拿到,好吧, ok, 那我这两个资源我就给你,并且呢我给你标记一个已经出去了,好吧,那此时 a, 我想要这两个资源,那不行,因为我这里标记已经出去了, 那你只能呢在外面等着,那我通过自选的方式让你一直在外面等, ok, 我 a 用完这两个资源呢,我给他放回去,我把这个标识给他抹掉,那此时呢 b 就可以拿到这两个资源,那么自选呢就结束, 那在他代码当中怎么实现呢?也非常的简单,我这里呢就有一个这个资源的管理者,好吧,那么他有一个例子呢,用来存这两个资源,有一个 app 方法,好吧,然后呢有个福利方法去释放这两个资源,那在我们转账的时候啊,在我们转账的时候,我就先 通过某一个县城先进来,先去调这个 app 方法,也就是说呢,先去拿到这两个资源,如果资源拿到了,正常的执行下面的代码, ok, 那如果在县城一执行的过程当中,我县城二进来,那么他此时呢会 app 会 返回 force, 他拿不到这两个资源,好吧,因为我这个历史的里面呢,已经有这两个资源了,他会判断已经存在了,会 return force, 那么我这里呢会一直的自悬下去, 直到我现成一用完这两个资源给他释放掉,那么我现成二呢,才能拿到这个资源,并且正常的往下面去执行, ok, 那么这是破坏占有且等待, 那第三点,不可抢占,这我们刚刚说的对吧?我虽然想要另外一个人的女朋友,但是我不能要求他们分手, 那么我们的星空奈子锁也是一样的,对不对?我不能去设置其他锁住的这个对象呢,进行释放,我只能用完了之后它自动释放,那我们能不能用一种变通的方式啊?比如说用这个洛克,大家用过没有?洛克呢,他有一个超时的机制,我通过洛克我锁住的这个资源啊,我可以设置超时,比如说我这里两秒, 如果两秒还没有释放,他将自动释放,能不能理解?那么这样呢?就能有效的去避免这个死锁,就比如说什么意思呢?我虽然对吧,我 a 不能要求你 b 主动放手, 但是呢我系统呢,给你们设置一个规则,你们这个热恋期啊,也就是你们在一起的时间只能两个月,好吧,那我 a, 我有一个女朋友,那此时我还想要 b 的女朋友 ak, 我等两个月,我等两个月,对吧?两个月过了之后我拿到,然后处理完呢,我就走了, 然后 b 也是这样的,我要你 a 的资源,那我一样的等待两个月,两个月过了我拿到资源,然后处理完直接走人,好吧,就那么这就是 破坏,不可抢占,虽然我们无法释放另外一个被锁住的资源,但是可以通过洛克去设置他的这个超时, ok, 然后呢第四点,循环等待,那循环等待,我们刚才已经说了,对不对?他们之间交叉的这样打, 互相等待,那我怎么解决这个问题呢?那我能不能这样,我让他们有序的等待,比如我现成 a, 我要这两个资源,我给他标做一个标记,我有序的去锁这两个资源,那我 b 我要这两个资源,我一样的按照你之前标记的这个资源呢 去锁这些资源。那么此时在高并发的一个情况下,我 a 首先呢拿到这个资源一,那 b 我想要资源一,我大不了就是等待堵塞嘛,对吧?等 a 处理完了,这个资源一释放了,我就能拿到,对吧?然后同样的他去获取资源二,我这我这个资源二,同样的我这个现成 b 想要资源二,我同样的会等待,对不对?那么现成 a 他用完了,他就释放了,释放完之后呢,我就可以拿到这两个资源来进行处理, 对不对?那在我们代码当中呢,实现起来也非常的简单,我在这里,我在这里创建这两个账户的时候呢,就有个 id, 那么我再去锁对象的时候,我就通过这两个 id 给他们重新的去排一下顺序,就比如说 id 小的我给他排在前面, id 大的我给他排在后面,那么我锁的时候呢,就按照这里的这个顺序来进行锁, 那么就不会出现死锁的一个情况下,那这就是产生死锁的四大因素,以及破坏这四大因素的方式。破坏这四大因素确实能够有效的去预防死锁, 但是呢,我们刚刚其实也看到通过这种方式呢,他其实会抑制我们系统的一个新能,对吧?会使我们应用的一个吞吐量呢降低,因为大部分的一个情况下呢,除了这个 破坏护士,对吧?基本其他的这种都变成了创新,对不对?就比如说这个战友节,等待我同时获得这两个资源,对吧?那另外一个新人就等等就得等待了,就变变成创新了,然后呢不可抢账也是一样的,对吧?我虽然设置了这个超时间,但是我依然 需要等待这个你设置的超时间循环等待也是一样的,我虽然按照顺序去给你加锁,但是呢,你在加锁的过程当中,我们另外一个县城依然无法获得你被锁的这个资源,对不对?但是有效的去解决了死锁, 所以说我们在现在这个实际开发当中,可以利用这种方式呢去预防思索,但是并不会百分之百的这样去做,因为哪怕有时候我们应用当中同时满足了这四大因素,也并不是说一定会出现思索,所以我们希望的是什么?能够 避免思索的出现,而不是说完全杜绝,好吧,破坏这四,这个四的因素就完全杜绝了,而要有效的一定几率的避免的话,大家可以去了解一个叫做银行加的算法,好吧,通过这个银行加算法呢,就能够去有效的一定几率的去避免这个思索, 那并且呢,我们的这个系统的吞吐量性能也能得到一定的保障,好吧,这个银行家算法我就不在这里展开来说了,同学们如果有兴趣呢,可以给徐老师点一波赞,如果赞这个超过了一千呢,我就给大家呢去讲一讲这个银行家算法是怎么回事? ok, 然后那么这个思索的解决 定位第二个呢,破坏我们的这个四大因素,从而呢完全的去杜绝我们的思索。第三,我们其实可以通过银行加算法呢,有一定的几率的去避免思索,从而既能保证我们系统的吞吐量性能,对吧?又能去避免思索。 ok, 这三个知识点希望大家能够掌握,如果对你有帮助呢?可以三连支持一下,那么老师这个视力当中的代码也可以加我的资料来进行获取。 nice。

因为工作四年的小伙伴又被问到一道关于锁的问题,说什么条件下会产生死锁,如何去避免死锁?他说呢,在面试之前还特意刷了铁衣,但是到了面试的时候呢,脑海一片空白,不知道怎么回答。那么今天呢,我给大家彻底讲明白, 六大 max 里的文字版我已经整理在二十万字的文档里面了,有需要的小伙伴可以在评论区领取。 现在看这一段视频,看完这个视频以后呢,也许你已经了解实属了, 那到底什么是实所呢?实所,简单来说就是两个或者两个以上的县城,在执行过程中需争夺同一个共享资源,从而导致相互等待的现象。如果在没有外部干预的情况下,县城呢就会一直处于主色状态,从而无法往下执行,这种一直处于等待主色状态的县城就被称为实所。县 产生死锁需要同时满足以下四个条件,第一个护士条件,共享资源 a 和共享资源 b 只能被一个县城占用。第二个就是请求和保持条件,县城 te 已经获取共享资源,在等待共享资源 b 的时候呢,不释放共享资源 a。 第三个呢,是不可抢占条件,其他县城不能强行抢占县城提一战友的资源。第四个是循环等待条件,县城提一,等待县城提二战友的资源,县城提二呢,等待县城一战友的资源。这样的话就形成了一个循环等待。 在县城产生实属之后呢,我们只能通过外部干预的解决问题,比如说重启程序或者是撒娇县城,所以呢,我们只能在写代码的时候去规避实属的产生,那么我们如何在代码中去规避实属产生呢?根据实属产生的四个 条件,我们只需要去破坏其中一个条件,就可以去解决实属问题。第一个,护士条件是没办法被破坏的,因为他是护士所的基本约束,其他三个条件呢,都可以通过人工干预来进行破坏。比如说请求保持条件, 我们可以在首次执行的时候呢,一次性申请所有的资源,这样的话就不存在等待所的问题了。第二个,对于不可抢占条件来说,占用部分资源的县城,在进一步申请其他资源的时候,如果申请不到的话,我们可以主动释放他占有的资源,不可抢占这个条件就被破坏了。 第三个循环等待条件,我们可以通过按序申请资源来防止死处的产生。所谓按序申请呢,就是给资源编号, 我们所有的县城可以按照线性化的序号顺序去申请共享资源,先申请序号小的,再申请序号大的,这样的话循环等待自然就不存在了。以上就是我对实属的理解,我是被变成耽误的王一汤,如果的分享对你有帮助,请你动动手指,一键三连分享给更多的人,关注我,面试不再难!

一个去美团面试的小伙伴私我说,被面试官问到一个实属的问题,难倒了,面试前还特意刷了题,面试的时候呢,老子的一片空白,不知道怎么回答,今天呢,我给大家彻底讲明白。先来看这样一段视频, 看完之后呢,也许你已经懂了,那到底什么是实属呢?实属简单的来说就是两个或者两个以上的现成,在执行过程中去争夺一个共享的 资源,导致互相等待的现象,如果没有外部干预的话,就会一直处于主色状态,无法往下再执行,这样等待处于主色状态的现成被称为实所。现成。 产生实属呢,需要同时满足四个条件,第一个条件,付出条件,共享资源 a 和 b 只能被一个县城占用。第二个请求和保持条件,县城第一已经获取共享资源, a 在等待共享资源的时候不是 释放共享资源。第三个,不可抢占条件,其他县城不能强行去抢占县城 t 一战友的资源。第四个,循环等待条件,县城 t 一等待县城 t 二战友的资源。县城 t 二呢,等待县城 t 一战友的资源,这就形成了循环等待。 那线程产生实属之后,只能通过外部的干预来解决问题,比如说重启程序或者是 k l 线程,所以我们只能在写代码的时候去避免实属的产生。那么我们如何去避免实 的产生呢?根据产生实属的四个必要条件,我们只需要去破坏其中任何一个条件就可以去解决。第一个复制条件是没有办法去破坏的,因为他是复数数的基本约束。其他三个呢,可以通过人工干预来破坏, 比如说请求保持条件,我们可以在首次执行现身的时候,一次性申请所有的资源,这样的话就不存在等待所的问题了。第二个,对于不可抢占条件来说,占用部分资源, 先生在进一步申请其他资源的时候,如果申请不到,我们可以去主动释放他占有的所有的资源,这样的话不可抢占条件就被破坏了。第三个,对于循环等待条件来说,可以通过按序申请资源来防止失属的产生。所谓按序申请就是给资源编号 所的县城呢,可以按照线上化的顺序去申请共享的资源,先申请需要小的,然后再申请需要大的,这样的话循环等待自然就不存在了。 上就是我对实属的理解,听懂的小伙伴请关注,点个赞,下次不迷路我是被变成耽误的王一汤!如果大家还有其他疑问,请在评论区留言,如果本次面试解析对你有帮助,请你动一动手指,一键三连分享给更多的人!关注我,面试不再难!


什么是死锁?看看普通人和高手是如何回答这个问题的。普通人, 县城 a 占用对象所一,然后县城 a 占用对象所二,县城 a 呢,需要继续获得对象所二才能继续执行,所以县城 a 需要等待 线程 b 释放对象锁二,线程 b 呢,需要获得对象所一才能继续往下执行,同样也需要等待线程 ae 释放对象锁二。由于这两个线程都不释放自己已经占有的锁,所以会导致两个线索于无线等待状态,这个就是时速 高手的回答。关于这个问题,我会从三个方面回答,第一个是什么时锁?所谓时锁是一组互相竞争资源的现成,因为互相等待导致永久主视的现象。第二个是发生时 原因,发生死锁原因有四个,第一个是复制条件,共享资源 x 和 y 只能被一个县城占用。第二个是占有且等待县城 t 一已经取得了共享资源 x, 在等待共享资源 y 的时候不释放共享资源 x。 第三个是不可抢占 其他县城,不能强行去抢占县城梯一战友的资源。第四个是循环等待县城梯一等待县城梯二战友的资源,县城梯二等待县城梯一战友的资源,这就是循环等待。 第三个点是如何去避免死锁呢?既然发生死锁的原因是需要同时满足这四个条件,那么我们只需要去打破其中任何一个条件即可避免死锁的问题。而在这四个条件中,第一个护士条件是无法被破坏的,因为锁本身就是通过护 是来解决现场安全性问题的,所以对于剩下三个,我们可以逐一进行来分析,第一个是对于占有且等待这个条件,我们可以一次性去申请所有的资源,这样就不存在等待。 第二个是对于不可抢占这个条件,占有部分资源的现成,进一步申请到其他资源的时候,如果申请不到,可以主动去释放他占有的资源,这样不可抢占这个条件就会被破坏。 第三个点对于循环等待这个条件,可以按照顺序去申请资源来进行预防。所谓的按序来申请是指资源是有限顺序的, 申请的时候可以先申请资源序号小的再申请资源序号大的,这样现金换以后就不存在循环等待。怎么样,发现他们两个的区别了吗?如果你喜欢今天的视频,记得点赞收藏哦!

他们老师实属应该怎么理解呢?我想了好久都没想明白。所谓实属呢,他就是一种相互竞争自由的现成,相互只有对方的资源,而且呢要相互等待,同样导致永久主受的现象。 那请问导致实属的原因有哪些?根据网络上各大不足的统计呢,发生实属的原因一共有四个,第一个呢是互数条件,第二个呢是占有且等待条件, 第三个呢是不可抢占条件,第四个呢是循环等待条件。那如果发生了实属的话,你推荐什么样的一个解决方案呢?凝聚毕生数学给大家研制了一份嘉瓦程序员的一个求职突击手册, 花花简历模板应试突击押题一周的一个技术提升以及加瓦提升的一个完整学习路线领取方式呢,在我视频主页一次在 保你高薪无忧。直属一旦发生呢,几乎是不会给你的,只能去总结程序啊,或者是跳进程。但是呢,实属这种现象我们可以去提前规避,也就是说前面总结的导致实属的四个条件,只要同时满足的话就会发生实属。 那么要避免失足的话,那就只需要去打破其中任意一个条件,就可以去避免失足的发生。那具体怎么样破坏这四个条件呢?好的,那第一个复制条件呢,是无法被破坏的,因为呢我的本身就是通过复出来解决现场安全问题的。 其他三个条件呢,我来足够分析一下。首先呢破坏第二个占有钱等待条件,我们可以在程序运行之前呢,可以一次性申请所有的资源,这样的话呢就不会存在资源等待了,然后呢破坏第三个不可抢占条件, 我们可以占用部分资源的现成,在进一步申请其他资源的时候呢,再做判断,如果申请不到的话,就可以主动去释放他占有的资源,这样的话呢不可以抢占这个条件呢,就不成立了, 这就是破坏第四个循环等待条件,我们可以去安装一个线线的顺序申请资源,从而能够去避免市场。 比如说我们可以给每个资源进行一个编号,那么在申请的时候呢,就可以先申请资源序号小的,然后呢再申请资源序号大的,那这样一个现线花之后呢,自然也就不存在使用花等待了。

哎,别滑了,十五秒模拟面试他乡思索的必然条件是什么? 死记硬背的四点控制条件请求与保持不可剥夺,循环等待。

机械伤害的十二条预防铁律之四停用一、无连锁防护停用机械设备中的连锁防护装置可以防止误操作和意外发生。 在使用机械设备时,必须确保所有的连锁防护装置都起到作用。二、无接地漏电保护停用机械设备中的接地漏电保护装置可以防止电机和其他电气风险。在使用机械设备时, 必须确保所有的接地漏电保护装置都起到作用。三、无港前培训停用机械设备的安全操作需要经过专业的培训和指导。在使用机械设备之前,必须确保所有操作人员接受了必要的培训和指导,了解机械设备的性能和操作规范。 四、无安全操作规范停用机械设备的安全操作需要遵循相关的操作规范和标准。在使用机械设备时,必须确保所有操作人员了解相关的安全操作。机械伤害的十二条预防铁律,你学会了吗?

必须遵守的机械设备四停用原则预防机械设备伤害,一定要安全操作机械设备的四、停用一、 无连锁防护装置的设备要停用。在危险性较大的设备上,未安装两种及两种以上的安全保护装置的设备必 息停用。这些装置保障着我们的肢体部位,不会接触到设备的危险区域,所以安装必须规范,严禁私自拆除、屏蔽,如注射机、安全门的连锁开关、创窗侧面的保护网、开启锁关、 商店保护开关、双手同步按钮等防护装置。二、无接地、漏电保护的设备要停用。外壳未接地、未安装符合要求漏电保护开关的设备要停止使用。三、无岗前培训要停用。操作危险性较大设备的员工、技术员、管理人员上岗 岗前未进行安全培训或考核合格要停止使用。如操作重床、住宿机、压柱机等设备的员工、技术员、管理人员必须进行岗前培训并考核合格。四、 安全操作规程要停用设备无上岗前作业过程中作业后应该做什么、必须做什么、严禁做什么的安全规程要停止使用。 作业前佩戴相应的个人防护用品,检查安全装置的有效性。作业过程中发生故障应该怎么办?安全操作规程不等于作业流程,表述上一定要通俗易懂。我是老孟,关注我,下期我们接着说制造。

我跟你们讲,真的太可怕了,昨天晚上我刚躺下就有人敲我的门,就是那种隔几分钟就敲一下的,然后直到晚上凌晨一点钟,我还能听见外边有人走路的那种溜达声音。 我赶紧给我朋友发了个求助信息。所以今天这期视频,无论是自己独居还是身边有朋友独居的,一定要耐心看完这期视频都是关键时候能救命的。 一、门口贴喜字门口放男士拖鞋,我劝你赶紧扔了吧,在门口贴一个喜字皮,这些管用的多,别问我怎么知道的。二、关闭照片定位喜欢拍照分享日常的姐妹要注意了,有的人可能根据一张照片就可以定位到你家小区,现在就打开你的设置,找到隐私相机定位服务选择不允许定位, 不要嫌麻烦,不怕万一,就怕意外。三、下载警报器经常走夜路的女生,手机里下载一个虚拟警报器,感觉危险,靠近的时候按一下警报器,他的声音 巨大,当下就能把对方震惊到,同时也能帮我们发出求救信号。四、陌生人同城电梯后按楼层 和陌生人乘坐电梯,等对方按完了你再按,然后尽量站在按钮旁,如果感觉情况不对,直接按。求就近 家门口装可视门铃有人敲门的时候别再从门上的猫眼看了,对方也可能看到你。装一个这样的可视门铃,有人逗留十秒以上就会自动录像,要是暴力拆解还会高分被自动报警。六、买个阻门器插在门下每一个独居的女孩子为了安全起见,都去买一个这个阻门器, 他是这样插在门下,我二百斤的朋友都撞不开。七、快递信息写男士找男性朋友录音快递信息只写男士是不够的,不如找你的男朋友,或者同时给你录一句,这个放门口就好了,再多录几句,像这种我一会就到了在哪呢之类的话 都可以放在你的备忘录里,有需要的时候直接外放就好了。八、保护个人隐私快递盒子扔之前有信息的地方用打火机烧一下,直接有效打码。生活垃圾也不要随便丢门口会被坏人。掌握生活习惯,传单贴纸及时清理,发现这种 还有这些赶紧划掉,你家可能已经被藏过点了。九、牢记幺二幺幺零,可迅速报警最后请牢记这串数字,如果遇到不方便打电话的情况,输入姓名加地址,也可以直接报警。看完记得转发给你最重要的人来看!真心希望每个女孩子一辈子都用不上!