为什么AbstractQueuedSynchronizer的子类应该是内部类?

时间:2018-01-04 12:42:13

标签: java jdk1.6

我的jdk版本是1.6,我找到了这样的AbstractQueuedSynchronizer的描述:

  

子类应定义为非公共内部帮助器类,用于实现其封闭类的同步属性。

使用内部课程有什么好处?

4 个答案:

答案 0 :(得分:1)

AbstractQueuedSynchronizer提供了大量public方法,并且所有这些方法都不太可能作为您自己的public API的一部分。公开这些不需要的方法会分散您的实际API,甚至会损害代码的稳定性。更糟糕的是,这个类的API可能会发展,提供更多的方法,你无法事先知道它们是否适合你的用例。

请注意,java.util.concurrent包的许多并发工具在内部使用此类,而不公开所有AQS方法。

此外,在内部使用AbstractQueuedSynchronizer可让您切换到另一个类,例如Java 6引入了AbstractQueuedLongSynchronizer,而在Java 5中只有AbstractQueuedSynchronizerjava.util.concurrent的某些类可能已经切换,从那时起你没有注意到。

答案 1 :(得分:0)

AbstractQueuedSynchronizer是一个为FIFO类结构提供阻塞机制的框架。您可以看到许多阻止结构扩展此类的功能以实现锁定机制。

例如,您可以看到ReentrantLock类通过扩展AQS的Sync类提供公平/不公平的锁定。关于内部课程,这是一个组合的案例。内部类仅存在以帮助其父类。

我希望它有所帮助。

答案 2 :(得分:0)

这是因为否则你将不得不从AbstractQueuedSynchronizer扩展你自己的类,你不会这样做,因为它会给你自己的类层次结构带来不必要的依赖。

答案 3 :(得分:0)

谢谢大家!综合你的答案,也许问题的原因是:

  1. 通常子类只是由它的外部类使用,所以不需要在jdk中定义普通类

  2. 我们可以使用组合而不是扩展。同时,我们可以避免暴露那些不需要的方法

  3. 再次感谢你!