【问题标题】:Inheriting and overriding synchronized methods [duplicate]继承和覆盖同步方法[重复]
【发布时间】:2017-11-21 18:47:02
【问题描述】:

如果一个类有同步方法,它的子类是否也有相同的同步方法,无论是简单地继承还是被子类覆盖?

具体来说,

  • 旧版Vector 具有同步方法,StackVector 的子类。 Stack 也有同步方法吗?

  • 旧版Hashtable 具有同步方法,而PropertiesHashtable 的子类。 Properties 也有同步方法吗?

我提问的动机来自What are the replacements for legacy collections `Stack` and `Properties`?

谢谢。

【问题讨论】:

  • 为什么方法的synchronized属性会因为它被继承而消失?
  • 有人想回答我关于StackProperties的具体收藏的问题吗?
  • @Ben 回答特定集合类的问题没有意义。所有课程的答案都是一样的。
  • @Andy 我的意思是我们是否需要找到StackProperties 的同步替换。见这里stackoverflow.com/questions/1386275/…
  • @Ben 您的第一个问题和第二个问题有何关联?如果您要问StackProperties 是否继承synchronized 方法,答案是肯定的。如果您想问 Java 是否应该有一个像 Stack 这样的替代线程安全类,那么与您的第一个问题相比,这似乎是一个不相关的问题..

标签: java multithreading inheritance collections thread-safety


【解决方案1】:

如果一个类有同步方法,它的子类是否也有相同的同步方法,无论是简单地继承还是被子类覆盖?

超类中的synchronized 方法可以在子类中被覆盖为非synchronized 方法,反之亦然。

如果子类没有重写 synchronized 方法而只是继承它,则该方法将作为 synchronized 方法原样继承。

我想知道我们是否需要找到同步替换 堆栈和属性

StackProperties 是线程安全的类,因为它们的大多数方法都是synchronized(包括从Vector/Hashtable 继承的方法)。尽管如此,这仍然不能保证它们不会在多线程上下文中被错误地使用。

【讨论】:

    【解决方案2】:

    子类从其超类继承所有成员(字段、方法和嵌套类)。构造函数不是成员,所以不被子类继承,但是子类可以调用超类的构造函数。

    但是,子类不继承其父类的私有成员。但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法

    是的,同步方法是由子类继承的。您可以通过javadoc了解更多详情。

    【讨论】:

    • 我不知道这个答案的前 3/4 与回答问题有什么关系。
    • gee.cs.oswego.edu/dl/cpj/mechanics.html 说同步没有被继承。
    • 试图解释继承。
    • @VeneetReddy 它说“所以当子类覆盖超类方法时,同步修饰符不会自动继承”,就像你覆盖该方法但省略 synchronized 一样,被覆盖的方法是不同步的。
    猜你喜欢
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 2019-04-27
    • 1970-01-01
    相关资源
    最近更新 更多