java, 继承与依赖ReentrantLock, 在使用方法上的区别?

J2EE 码拜 10年前 (2015-04-21) 1626次浏览 0个评论

最近在看guava的cache源码, 发现LocalCache.Segment类是继承ReentrantLock.

但是我看Segment只用到了lock,unlock,isHeldByCurrentThread 三个方法,

这三个方法都是public的,就是说如果用依赖的方式,这几个方法都可以调用到的.

 

又查了一下ReentrantLock 的子类, 发现子类包括有: java.util.concurrent.ConcurrentHashMap.Segment

 

那么为什么不使用依赖(ReentrantLock lock= new ReentrantLock()), 而是用继承呢??

或者说在什么情况下能体现出继承的好处?

java, 继承与依赖ReentrantLock, 在使用方法上的区别?
别人还要用Segment呢  不继承哪来的ReentrantLock中的方法?
java, 继承与依赖ReentrantLock, 在使用方法上的区别?
引用 1 楼 sunbo624 的回复:

别人还要用Segment呢  不继承哪来的ReentrantLock中的方法?

这个我想过, 所以进一步看了一下, 在guava中, Segment类的使用者是LocalCache及其内部类, 都没有使用到ReentrantLock类的任何方法呢. 

java, 继承与依赖ReentrantLock, 在使用方法上的区别?
继承目的就 是不忘本,再创新的意思!

将可用的拿来,还可以在其拿来的基础上进行修改创新。

还有就是直接拿来使用势必导致多个地方调用,还不如我自己使用我的东西,然后内部的所有类都使用它。
这样也清晰明了些。不用多次调用别人的东西。

java, 继承与依赖ReentrantLock, 在使用方法上的区别?
引用 3 楼 shnulaa 的回复:

继承目的就 是不忘本,再创新的意思!

将可用的拿来,还可以在其拿来的基础上进行修改创新。

还有就是直接拿来使用势必导致多个地方调用,还不如我自己使用我的东西,然后内部的所有类都使用它。
这样也清晰明了些。不用多次调用别人的东西。

同意  不是说组合一定优于继承  继承的本来目的是为了复用  不需要加入任何东西就能复用

java, 继承与依赖ReentrantLock, 在使用方法上的区别?
引用 4 楼 sunbo624 的回复:
Quote: 引用 3 楼 shnulaa 的回复:

继承目的就 是不忘本,再创新的意思!

将可用的拿来,还可以在其拿来的基础上进行修改创新。

还有就是直接拿来使用势必导致多个地方调用,还不如我自己使用我的东西,然后内部的所有类都使用它。
这样也清晰明了些。不用多次调用别人的东西。

同意  不是说组合一定优于继承  继承的本来目的是为了复用  不需要加入任何东西就能复用

这个我能理解, 问题在于, 继承之后,并没有使用protected方法, 也没有方法覆盖, 只调用了几个public方法. 所以不认为复用是这么用的根本原因.

java, 继承与依赖ReentrantLock, 在使用方法上的区别?
40分
引用 5 楼 fly0wings 的回复:
Quote: 引用 4 楼 sunbo624 的回复:
Quote: 引用 3 楼 shnulaa 的回复:

继承目的就 是不忘本,再创新的意思!

将可用的拿来,还可以在其拿来的基础上进行修改创新。

还有就是直接拿来使用势必导致多个地方调用,还不如我自己使用我的东西,然后内部的所有类都使用它。
这样也清晰明了些。不用多次调用别人的东西。

同意  不是说组合一定优于继承  继承的本来目的是为了复用  不需要加入任何东西就能复用

这个我能理解, 问题在于, 继承之后,并没有使用protected方法, 也没有方法覆盖, 只调用了几个public方法. 所以不认为复用是这么用的根本原因.

This subclass inherits from ReentrantLock
   opportunistically, just to simplify some locking and avoid separate construction.

java doc 已经说的蛮明白的
这里投机的继承了ReentrantLock,仅仅想简单化一些锁的操作和 避免单独再去构建锁的逻辑了。

因为subclass  segment需要用到重入所的一些功能,又不想自己再去实现。所以投机了使用了ReentrantLock原有的功能。

java, 继承与依赖ReentrantLock, 在使用方法上的区别?
引用 6 楼 shnulaa 的回复:

This subclass inherits from ReentrantLock
   opportunistically, just to simplify some locking and avoid separate construction.

java doc 已经说的蛮明白的
这里投机的继承了ReentrantLock,仅仅想简单化一些锁的操作和 避免单独再去构建锁的逻辑了。

因为subclass  segment需要用到重入所的一些功能,又不想自己再去实现。所以投机了使用了ReentrantLock原有的功能。

这个看到了, 但不足以解答我的疑问, 它所说”avoid separate construction”, 是指避免构造new  ReentrantLock? simplify some locking 仅仅是从lock.lock() 简化为 this.lock() ? 如果是, 那么什么时候用extends 什么时候用field?(似乎和这个ReentrantLock的使用没太大关系了, 变为OOP的问题了,希望一并整明白吧.)

java, 继承与依赖ReentrantLock, 在使用方法上的区别?
引用 7 楼 fly0wings 的回复:
Quote: 引用 6 楼 shnulaa 的回复:

This subclass inherits from ReentrantLock
   opportunistically, just to simplify some locking and avoid separate construction.

java doc 已经说的蛮明白的
这里投机的继承了ReentrantLock,仅仅想简单化一些锁的操作和 避免单独再去构建锁的逻辑了。

因为subclass  segment需要用到重入所的一些功能,又不想自己再去实现。所以投机了使用了ReentrantLock原有的功能。

这个看到了, 但不足以解答我的疑问, 它所说”avoid separate construction”, 是指避免构造new  ReentrantLock? simplify some locking 仅仅是从lock.lock() 简化为 this.lock() ? 如果是, 那么什么时候用extends 什么时候用field?(似乎和这个ReentrantLock的使用没太大关系了, 变为OOP的问题了,希望一并整明白吧.)

他不想自己再去实现重入锁的功能了,所以直接就拿过来用了,这个很简单的问题。再搞就是牛角尖了。。。
还是重点看它源代码 扩展了哪些功能吧。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明java, 继承与依赖ReentrantLock, 在使用方法上的区别?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!