死锁、活锁学习小结

    技术2022-07-12  85

    死锁 DeadLock

    死锁是什么?

    互不相让:当两个(或更多)线程(或进程)相互持有对方所需要的资源,又不主动释放,导致所有人都无法继续前进,导致程序陷入无尽的阻塞,这就是死锁。

    死锁的影响

    死锁的影响在不同系统中是不一样的,这取决于系统对死锁的处理能力 数据库中:检测并放弃事务 JVM中:无法自动处理

    死锁发生的几率不高,但危害很大,宛如森林火灾

    发生死锁的4个必然条件(同时满足)

      互斥条件 [不共享]
     请求与保持条件
     不剥夺条件[不主动释放(mysql)]
     循环等待条件[构成环路]

    如何定位死锁?

    Jstack ThreadMxBean

    修复死锁的策略

    避免策略 检测与恢复策略

    实际工程中怎么避免死锁?

    设置超时时间多实用并发类而不是自己设计锁降低锁的粒度,尽可能使用不同的锁如果能使用同步代码块,就不使用同步方法给线程起有意义的名字避免锁的嵌套使用分配资源前先看能不能收回来专锁专用

    活锁 LiveLock

    什么是活锁

    虽然线程并没有阻塞,也始终在运行(所以叫做“活”锁,线程是“活”的),但是程序却得不到进展,因为线程始终重复做同样的事 死锁和活锁的结果是一样的

    如何解决活锁问题

    原因:重试机制不变,消息队列始终重试,吃饭始终谦让 以太网的指数退避算法 加入随机因素

    工程中活锁实例:消息队列

    原因:消息如果处理失败,就放在队列开头重试 解决:放到队列的尾部,添加重试限制次数

    线程的饥饿

    产生原因: 当线程需要某些资源(例如CPU),但是却始终得不到 线程优先级过低 某线程持有锁但不释放

    Processed: 0.021, SQL: 11