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

我有一类线程安全的公共代码。

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

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

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

这个效果有关键字或注释吗?

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

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

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

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

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

来自子类中的Synchronized方法

Synchronized是方法的实现细节。 您可以使用方法覆盖同步方法,而不将其声明为同步,反之亦然。 同样适用于超载也是如此。

您还可以查看, 超类中的synchronized方法获取与子类中的锁相同的锁。

这个到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(); } }