Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么要抽象队列同步器';s子类应该是内部类吗?_Java_Jdk1.6 - Fatal编程技术网

Java 为什么要抽象队列同步器';s子类应该是内部类吗?

Java 为什么要抽象队列同步器';s子类应该是内部类吗?,java,jdk1.6,Java,Jdk1.6,我的jdk版本是1.6,我发现AbstractQueuedSynchronizer的描述如下: 子类应定义为非公共内部帮助器类,用于实现其封闭类的同步属性 使用内部类的好处是什么?AbstractQueuedSynchronizer是一个为类似FIFO的结构提供阻塞机制的框架。您可以看到许多块结构扩展了这个类的功能以实现锁定机制 例如,您可以看到ReentrantLock类通过扩展AQS的Sync类提供公平/不公平锁定。关于内部类,这是一个组合的例子。内部类的存在只是为了帮助它们的父类 我希望它

我的jdk版本是1.6,我发现AbstractQueuedSynchronizer的描述如下:

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


使用内部类的好处是什么?

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

例如,您可以看到ReentrantLock类通过扩展AQS的Sync类提供公平/不公平锁定。关于内部类,这是一个组合的例子。内部类的存在只是为了帮助它们的父类


我希望它能有所帮助。

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

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


另外,在内部使用
AbstractQueuedSynchronizer
允许您切换到另一个类,例如Java 6引入了
AbstractQueuedLongSynchronizer
,而在Java 5中只有
AbstractQueuedSynchronizer
,而
Java.util.concurrent
的一些类可能从那时起就切换了,在您没有注意到的情况下。

这是因为否则您将不得不从AbstractQueuedSynchronizer扩展您自己的类,并且您不会希望这样做,因为这将给您自己的类层次结构带来不必要的依赖性

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

  • 通常,子类只由它的外部类使用,因此不需要在jdk中定义普通类

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

  • 再次感谢你

    提醒我如何对正在实现的公共接口隐藏方法—创建一个内部类来实现接口,并且只在需要时公开方法