本文共 723 字,大约阅读时间需要 2 分钟。
在我们利用封锁技术时,可以避免并发操作引起的各种错误,但是可能产生三个问题:活锁、死锁和饥饿。以下是个人的简单理解。
活锁
活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程。处于活锁的实体是在不断的改变状态,活锁有可能自行解开。
例子:你骑车的时候对面方向迎来了一个人,你往左偏给对方让路,结果对方同样也右偏了给你让路,你俩还是头对头;然后你无奈的往右偏,希望对方从右边过去,结果对方跟着你偏了,你俩还是头对头;然后你不断换方向,对方不断跟着换方向…好无奈。
死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
例子:两人在独木桥相遇,谁也不让谁先过去,然后两人僵持不下,其他的人也没有办法过桥,面对两个暴脾气,被迫看戏中。
饥饿
是指如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后,系统又批准了T4的请求......T2可能永远等待。
例子:两个人过独木桥,B让A先走了,然后又来了C,B继续礼让,让C走,结果又来了D、E、F,然后B就一直礼让,一直等待,始终没过独木桥,乖乖做个安静的美男子。
区分
活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”,而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。活锁可以认为是一种特殊的饥饿,它一种“活”的饥饿。
转载地址:http://nyzci.baihongyu.com/