您的位置: 本溪资讯网 > 时尚

关于Condition中访问AQS方法的

发布时间:2019-11-29 02:56:23

在昨天的文章中,我提到 它可以访问AbstractQueuedSynchronizer中的方法和其余内部类(AbstractQueuedSynchronizer是个抽象类,至于他怎么能访问,这里有个很奇妙的点,后面我专门用demo说明)

现在专门来说下这个问题。

AQS中有个public 内部类,(没错就是public 内部类)实现了Condition接口,叫做ConditionObject :

一般,内部类是不允许被定义为public的,这里可以的原因是它的外部类AQS(AbstractQueuedSynchronizer)是抽象类,所以它可以有一个public的内部类。 我用一段demo模拟了这种结构:

可以看到Condition的signal方法可以调用外部抽象类的enq方法,这里编译通过了,是不是觉得很奇妙,为什么一个public的内部类类还可以调用外部抽象类的方法呢?

抽象类是不能被实例化的,那它的成员方法怎么会被调用?

于是我写了个demo:

可以看到这里是不能直接new Condition的,Condition明明是public的为什么不能直接new 呢? 这也是我疑问的地方。

仔细琢磨一番后,想起来了, 内部类的实例化只有加上static 修饰符后 才可以不和外部类有任何关系,随意进行实例化,你可以把static 修饰的内部类直接当成一个完全独立的类是去使用。

反之,不管你是不是被public 修饰,只要是内部类,就必须依托于外部类的一个实例去实例化,这里外部类是抽象的,不能直接实例化,那还不简单,这么做:

通过编译了,再运行一下:

用法还是很巧妙的,没错,Condition和AQS就是这么设计和实现的。

旅游规划
夏商西周
新三板
猜你会喜欢的
猜你会喜欢的