可重入锁(递归锁)
以synchronized为例:
- why?
如果synchronized是不可重入的, 那么会经常发生死锁. 为了避免死锁的发生, synchronized是可重入的. - what?
一个类中存在两个synchronized修饰的方法,在 A方法中调用B方法,当B方法执行完返回A方法的时候,无需重新获取锁(this对象), 称为锁具有可重入性. 除了synchronized, 常见的还有ReentrantLock锁. - how?
每个锁对象关联一个计数器, 当计数器为0的时候, 其他线程可以获取锁对象. 当计数器不为0时, 其他线程阻塞. 持有锁对象的线程, 每获取一次锁对象, 计数器加1, 每退出同步块释放锁对象一次, 计数器减1. 以此来实现可重入.