避免活跃性危险
在安全性和活跃性之间通常存在某种制衡。即我们在用加锁来保证安全性的时候,可能会引发死锁。
死锁
对于死锁 有个经典的问题,哲学家就餐,五个哲学家 坐在一个圆桌上,他们中间放着一根筷子,但是只有拿起两字筷子时才能就餐。那么就可能出现五人都无法就餐的情形。
即,大家都在持有别人想要的资源,且在等待别人的资源,又在得到前不会放弃手里的资源。
锁顺序死锁
当两组任务以不同的顺序来获取两个锁,那么就有可能发送死锁。
动态锁顺序死锁
原理和上面类似,就是任务获取锁的顺序有时候相同,有时候不同。
资源死锁
正如前面所说,当多个线程互相持有对方需要的锁且不释放自己的锁会发生死锁。把锁换成资源也是同样的道理。
如两个线程等待线程池资源,a线程持有A池的连接,去等待B池的连接。b线程持有B池的连接,去等待A池的连接。我们可以看到,假如我们能保证它们是相同的顺序,那么就不会出现这个问题。
死锁的避免与诊断
如果一个线程只能获取一个锁或者资源,那么就不会出现死锁。当然这种情况不能强求,那么我们应该保证线程获取锁的顺序一致。其实通过我们上面一系列的分析,这个顺序一致是破除死锁的关键。
支持定时的锁
我们知道死锁发生还有一个条件,就是一直等待别人的锁,那么要是我不是等待,那么就不会发送,而显示锁的tryLock的时间就可以满足这一点。