我有一类线程安全的公共代码。
该类中的一个方法是抽象的,需要为不同的实现重写。
我需要确保或至少向其他开发者标记此方法的所有实现都需要是线程安全的。
这样做的最佳方式是什么?
此效果是否有关键字或注释?
我已尝试abstract synchronized
,但不允许使用关键字组合。
答案 0 :(得分:26)
你不能直接这样做。你可以做的一件事是让方法具体,但是调用一个抽象方法:
public synchronized final void foo() {
doFoo();
}
protected abstract void doFoo();
这样,doFoo()将始终*在foo()建立的同步下调用。
*除非有人直接调用它,所以你应该命名并记录它,以明确它们不应该。
答案 1 :(得分:1)
来自Synchronized method in subclass
Synchronized是方法的实现细节。 您可以使用方法覆盖同步方法,而不将其声明为同步,反之亦然。 对于重载也是如此。
您还可以查看A synchronized method in the superclass acquires the same lock as one in the subclass.
答案 2 :(得分:0)
This link to the JLS确认我们不能混合抽象和同步。
虽然比关键字或标准注释弱得多,但比文档更强:或许尝试Marker interface?
...提供了一种将元数据与其中的类相关联的方法 语言没有明确支持此类元数据。
这是一个延伸,但可能有所帮助,因为派生类发出声明(编辑:新示例测试声明):
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(); }
}