在阅读ReentrantLock的源代码时,我发现它内部使用了一个扩展AbstractQueuedSynchronizer的同步器来控制锁。Doug在这个纸中提到,AbstractQueuedSynchronizer充当了一个“模板方法模式”,这有助于简化子类的编码。
然而,约书亚·布洛赫在有效Java中建议我们应该“倾向于组合而不是继承”,因为“与方法调用不同,继承违反了封装”。据我理解,Spring中的“模板”(例如RedisTemplate、TransactionTemplate等) 遵循这条规则。
因此,回到AbstractQueuedSynchronizer和ReentrantLock中定义的同步器,我想知道它的设计(基于模板方法模式)是否有任何缺点。非常感谢!
发布于 2021-06-19 19:48:26
在AbstractQueuedSynchronizer的情况下,没有缺点,因为AbstractQueuedSynchronizer是谨慎的写成,因此继承不会违反封装:
final,因此子类不能更改它们。tryAcquire()、tryRelease()、tryAcquireShared()、tryReleaseShared()和isHeldExclusively()。实际上,此实现相当于组合:只需将5种可覆盖的方法移动到专用接口即可。
https://stackoverflow.com/questions/65209937
复制相似问题