递归调用场景下,可以直接把锁提到最外面来避免死锁。
我能想到的另一个重入锁的场景是,一个函数需要加锁但无法保证调用者是否已经占有锁,可能占有了锁,也可能没有占有锁,不可重入锁则函数需要提供两个变种,重入锁只需要提供一个就行了。
Go 的 Sync.Mutex 是不可重入的,而且也没有提供可重入的锁。Java 中,可重入锁似乎是必须的,Java Concurrency in practive 书中讲可重入性时举了这么个例子:
https://imgur.com/yDpZTfH在我看来,这是继承带来的耦合导致不得不使用重入锁来解决这个问题。
我感觉可重入锁并不是必不可少的,请大家指点一下。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/802765
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.