死锁的四个条件
死锁的四个条件:
- 互斥使用/独占
- 不可剥夺
- 保持与请求
- 循环等待
从破坏这四个条件入手
避免死锁的技巧
代码坏味道:
- 避免一个线程持有多个锁
- 避免一个线程占有多个资源(资源背后可能有锁)
- 使用锁尽可能使用定时锁
- lock的写法:private final Object lock = ……
- 一定要在finally中完成锁的释放
其中:
5.1:内部使用锁对象暴露给外界容易引起DOS攻击,长久持有从而引起死锁
5.2:Boolean.TRUE,“LOCK”、int等容易引起死锁,在可能重用的对象上同步会导致死锁和非确定性行为。
5.3:getClass()会引起子类使用到基于父类的锁
5.5:单个实例锁只能锁定单个实例对象
5.6:相同顺序
5.7:finally
5.10:并行流当中使用非线程安全的方法就会引起安全失败问题
5.2:错误的双检锁