首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java AbstractQueuedSynchronizer与模板方法模式

Java AbstractQueuedSynchronizer与模板方法模式
EN

Stack Overflow用户
提问于 2020-12-09 02:50:45
回答 1查看 100关注 0票数 0

在阅读ReentrantLock的源代码时,我发现它内部使用了一个扩展AbstractQueuedSynchronizer的同步器来控制锁。Doug在这个中提到,AbstractQueuedSynchronizer充当了一个“模板方法模式”,这有助于简化子类的编码。

然而,约书亚·布洛赫在有效Java中建议我们应该“倾向于组合而不是继承”,因为“与方法调用不同,继承违反了封装”。据我理解,Spring中的“模板”(例如RedisTemplateTransactionTemplate等) 遵循这条规则

因此,回到AbstractQueuedSynchronizerReentrantLock中定义的同步器,我想知道它的设计(基于模板方法模式)是否有任何缺点。非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2021-06-19 19:48:26

AbstractQueuedSynchronizer的情况下,没有缺点,因为AbstractQueuedSynchronizer是谨慎的写成,因此继承不会违反封装:

  • 子类没有可见的字段。
  • 所有方法(5个受保护的方法除外)都是final,因此子类不能更改它们。
  • 子类只允许覆盖5个受保护的方法:tryAcquire()tryRelease()tryAcquireShared()tryReleaseShared()isHeldExclusively()

实际上,此实现相当于组合:只需将5种可覆盖的方法移动到专用接口即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65209937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档