死锁,活锁,饥饿

死锁

死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待状态,没有任何个体可以继续前进。会出现在多线程,多进程间。

死锁必要条件:

  1. 资源独占(互斥使用)
  2. 占有且等待,申请新资源的同时,保持原资源的占有
  3. 不可抢占,不能被强行夺取资源,只能主动释放
  4. 循环等待,P1等待P2占有的资源,P2等待P3占有的资源,P3等待P4... Pn等待P1占有的资源,形成等待回路

如何在编程中尽量预防死锁呢?

  1. 尽量避免使用多个锁,容易掉坑
  2. 必须使用多个锁,尽量设计好锁的获取顺序
  3. 使用带超时的方法,为程序带来更多可控性
  4. ?一些其他方法,如通过静态代码分析(FindBugs)去查找固定的模式,进而定位可能的死锁或者竞争者情况。

活锁

线程A和B都需要过桥(都需要使用进程),而都礼让不走(那到的系统优先级相同,都认为不是自己优先级高),就这么僵持下去.(很绅士,互相谦让)

任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。

活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。

饥饿

是指一个可运行的进程尽管能继续执行,但被调度器无限期地忽视,而不能被调度执行的情况。

猜你喜欢

转载自www.cnblogs.com/fmys/p/10982894.html