monetto
2021-09-18 14:52:49 +08:00
RenentrantLock 只是没东西翻译了,翻译成了一个可重入锁,其实我觉得这玩意儿翻译成,“基于 AQS 的 公平 /非公平 且 可重入的锁”,像 synchronized 也是可重入的,只不过实现原理不一样。
RenentrantLock 的原理是判断 AQS 的队列中,当前线程是否为链表头,那么就可以直接获取,不需要在 AQS 中排队。
“递归调用场景下,可以直接把锁提到最外面来避免死锁”,这个形容不是很准确,有很多情况是,非递归调用,但是多线程情况下函数 A 和函数 B 的执行都需要这个独占资源,那么这时候就需要使用可重入锁。
严格的说,为了解决的问题是 “某个线程,再次获取想要独占的资源”而出现的,这种情况在多线程编程很多时候是会出现的,这时候就需要可重入锁解决问题,不是耦合导致不得不重入。
Go 是如何解决这种问题的我并不清楚,但是感觉原理应该和 JVM 差不多。