当前位置: 首页 > 知识库问答 >
问题:

在Java中重写同步方法

壤驷旭
2023-03-14

假设我在某个类上有一个同步方法:

abstract class Foo {
    public synchronized void foo() {  // synchronized!
        // ...
    };
}

我在不使用同步修饰符的情况下覆盖了它:

class Bar extends Foo {
    @Override
    public void foo() {               // NOT synchronized!
        super.foo();
        // ...
    }
 }

关于这个场景,我有几个具体的问题:

  1. 重写的方法也会隐式同步吗?
  2. 如果没有,超级-call会同步吗?
  3. 如果没有超级-call,会同步任何东西吗?
  4. 有没有办法强制覆盖方法使用同步(我注意到抽象方法定义或接口内的方法定义不允许同步关键字)?

共有2个答案

狄心水
2023-03-14

这将产生以下消息:

罗梓
2023-03-14
public synchronized void foo() {  // synchronized!
    // ...
};

本质上与:

public void foo() {
    synchronized (this) {  // synchronized!
        // ...
    }
};

后者更显式,所以我通常建议使用这种形式。或者最好使用私有字段而不是“外部”对象的锁。

所以:1。2号。是的。3。4号。标记方法最终并调用可能被覆盖的protected方法。

public final void foo() {
    synchronized (this) {
        fooImpl();
    }
};
protected void fooImpl() {
    // ...
}

和以往一样,授权可能比子类化更好。

 类似资料:
  • 来自java教程 > 与实例的超类相同的包中的子类可以覆盖任何未声明为私有或最终的超类方法。 不同包中的子类只能重写声明为public或protected的非final方法。 但有什么区别?如果一个方法没有声明为private,那么它必须是public还是protected no?

  • 请看下面给我带来麻烦的方法: 然后是run方法:

  • 本文向大家介绍java中重写equals()方法的同时要重写hashcode()方法(详解),包括了java中重写equals()方法的同时要重写hashcode()方法(详解)的使用技巧和注意事项,需要的朋友参考一下 object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 tr

  • 问题内容: 我有一类通用的代码是线程安全的。 该类中的方法之一是抽象的,需要针对不同的实现重写。 我需要确保或至少向其他开发人员标记此方法的所有实现都必须是线程安全的。 做这个的最好方式是什么? 是否有关键字或注释可达到此目的? 我已经尝试过了,但是不允许使用关键字组合。 问题答案: 您不能直接这样做。您可以做的一件事是将方法具体化,但是调用一个抽象方法: 这样,doFoo()将始终*在foo()

  • 问题内容: 我不确定这是否是同步我的的正确方法。 我有一个 从函数传递过来的。 现在,我正在尝试使其同步。这是否正确同步了我的对象? 问题答案: 您要进行两次同步,这是没有意义的,可能会减慢代码的速度:在列表上进行迭代时所做的更改需要整个操作的同步,在这种情况下,使用Using 这样做是多余的(它创建了一个包装程序来同步各个操作)。 但是,由于您要完全清空列表,因此迭代删除第一个元素是最糟糕的方法

  • 问题内容: 用Java如何实现方法重写?在C ++中,我们有vtable的概念。.这是如何在Java内部实现的? 问题答案: 为了回答这个问题,特别是在虚拟机中如何实现覆盖,在Java虚拟机编程(Google图书链接)中有一篇文章。 VM将在所引用的类中寻找适当的方法定义,然后逐步处理继承栈。显然,在某些阶段将应用各种优化。 有关相关字节码指令的说明,请参见此处: invokevirtual会查看