我有一类常见的代码是线程安全的。
一个在该类中的方法是抽象的,并且需要被重写为不同的实现。
我需要保证或至少国旗给其他开发者,这种方法的所有实现需要是线程安全的。
做这个的最好方式是什么?
是否有一个关键字或注释这种效果呢?
我已经尝试abstract synchronized
但关键字的该组合是不允许的。
我有一类常见的代码是线程安全的。
一个在该类中的方法是抽象的,并且需要被重写为不同的实现。
我需要保证或至少国旗给其他开发者,这种方法的所有实现需要是线程安全的。
做这个的最好方式是什么?
是否有一个关键字或注释这种效果呢?
我已经尝试abstract synchronized
但关键字的该组合是不允许的。
你不能直接这样做。 有一两件事你可以做的是有方法是具体的,但调用的抽象方法:
public synchronized final void foo() {
doFoo();
}
protected abstract void doFoo();
这样一来,doFoo()将始终*()由富确立同步下被调用。
*除非有人直接调用它,所以你应该命名并记录它,使之明确表示,他们不应该。
从在子类中的方法同步
同步是这样的方法的细节实行。 您可以覆盖一个方法的同步方法没有宣布该同步,反之亦然。 这同样适用于重载也是如此。
您还可以看看, 在超一个synchronized方法获得相同的锁为一体,在子类。
此链接到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(); }
}