26

我有一类线程安全的通用代码。

该类中的方法之一是抽象的,需要为不同的实现重写。

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

做这个的最好方式是什么?

是否有此效果的关键字或注释?

我已经尝试过abstract synchronized,但是不允许使用关键字组合。

4

3 回答 3

28

你不能直接做。您可以做的一件事是让方法具体化,但调用抽象方法:

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

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

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

于 2012-10-02T05:18:56.697 回答
1

来自子类中的同步方法

同步是方法的实现细节。您可以使用方法覆盖同步方法,而无需将其声明为同步,反之亦然。重载也是如此。

你也可以看看,超类中的同步方法获取与子类中相同的锁。

于 2012-10-02T05:25:48.550 回答
0

这个指向 JLS 的链接确认我们不能混合抽象和同步。

虽然比关键字或标准注释弱得多,但比文档强:也许试试Marker 接口

...提供了一种将元数据与语言没有明确支持此类元数据的类相关联的方法。

这是一个延伸,但可能会有所帮助,因为派生类进行了声明(编辑:新示例测试声明):

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(); } 
}
于 2012-10-02T07:00:06.563 回答