如何确保重写的方法是同步的

26

我有一个通用代码类,它是线程安全的。

该类中的一个方法是抽象的,需要根据不同的实现进行重写。

我需要确保或至少向其他开发人员标记,所有此方法的实现都需要是线程安全的。

最好的方法是什么?

是否有关键字或注解可以实现这一点?

我已经尝试了abstract synchronized,但这些关键字的组合是不允许的。

3个回答

28

你不能直接这样做。你可以做的一件事是将该方法设置为具体的,但调用一个抽象的方法:

public synchronized final void foo() {
    doFoo();
}
protected abstract void doFoo();

这样,doFoo() 将始终在 foo() 建立的同步下被调用。

* 除非有人直接调用它,所以你应该命名并记录它,以明确表明他们不应该这样做。


11
微调:将公共方法声明为final。 - Vance Maverick
太好了。我不知道为什么我没想到那个,这么简单。 - ljbade

1

0

这个JLS链接证实了我们不能混合使用抽象和同步。

虽然比关键字或标准注释弱,但比文档强:也许可以尝试标记接口

...提供了一种在语言不支持此类元数据的类中关联元数据的方法。

这有点牵强,但可能有帮助,因为派生类做出了声明(编辑:新的示例测试了声明):

interface EatMethodIsThreadSafe {}

abstract class Animal {
    public Animal() {
        if (! (this instanceof EatMethodIsThreadSafe)) { 
            throw new IllegalArgumentException("eat method must be thread safe");
        }
    }
    public abstract void eat();
}

public class Bear extends Animal implements EatMethodIsThreadSafe {
    public synchronized void eat() {}
    public static void main(String...args) { Bear b = new Bear(); } 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接