递归调用场景下,可以直接把锁提到最外面来避免死锁。
我能想到的另一个重入锁的场景是,一个函数需要加锁但无法保证调用者是否已经占有锁,可能占有了锁,也可能没有占有锁,不可重入锁则函数需要提供两个变种,重入锁只需要提供一个就行了。
Go 的 Sync.Mutex 是不可重入的,而且也没有提供可重入的锁。Java 中,可重入锁似乎是必须的,Java Concurrency in practive 书中讲可重入性时举了这么个例子:
https://imgur.com/yDpZTfH
在我看来,这是继承带来的耦合导致不得不使用重入锁来解决这个问题。
我感觉可重入锁并不是必不可少的,请大家指点一下。
我能想到的另一个重入锁的场景是,一个函数需要加锁但无法保证调用者是否已经占有锁,可能占有了锁,也可能没有占有锁,不可重入锁则函数需要提供两个变种,重入锁只需要提供一个就行了。
Go 的 Sync.Mutex 是不可重入的,而且也没有提供可重入的锁。Java 中,可重入锁似乎是必须的,Java Concurrency in practive 书中讲可重入性时举了这么个例子:
https://imgur.com/yDpZTfH
在我看来,这是继承带来的耦合导致不得不使用重入锁来解决这个问题。
我感觉可重入锁并不是必不可少的,请大家指点一下。