我有一个通用代码类,它是线程安全的。
该类中的一个方法是抽象的,需要根据不同的实现进行重写。
我需要确保或至少向其他开发人员标记,所有此方法的实现都需要是线程安全的。
最好的方法是什么?
是否有关键字或注解可以实现这一点?
我已经尝试了abstract synchronized
,但这些关键字的组合是不允许的。
我有一个通用代码类,它是线程安全的。
该类中的一个方法是抽象的,需要根据不同的实现进行重写。
我需要确保或至少向其他开发人员标记,所有此方法的实现都需要是线程安全的。
最好的方法是什么?
是否有关键字或注解可以实现这一点?
我已经尝试了abstract synchronized
,但这些关键字的组合是不允许的。
你不能直接这样做。你可以做的一件事是将该方法设置为具体的,但调用一个抽象的方法:
public synchronized final void foo() {
doFoo();
}
protected abstract void doFoo();
这样,doFoo() 将始终在 foo() 建立的同步下被调用。
* 除非有人直接调用它,所以你应该命名并记录它,以明确表明他们不应该这样做。
这个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(); }
}