我怎样才能确保一个重写的方法是同步的(How can I ensure that an overri

2019-08-01 02:06发布

我有一类常见的代码是线程安全的。

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

我需要保证或至少国旗给其他开发者,这种方法的所有实现需要是线程安全的。

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

是否有一个关键字或注释这种效果呢?

我已经尝试abstract synchronized但关键字的该组合是不允许的。

Answer 1:

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

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

这样一来,doFoo()将始终*()由富确立同步下被调用。

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



Answer 2:

从在子类中的方法同步

同步是这样的方法的细节实行。 您可以覆盖一个方法的同步方法没有宣布该同步,反之亦然。 这同样适用于重载也是如此。

您还可以看看, 在超一个synchronized方法获得相同的锁为一体,在子类。



Answer 3:

此链接到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(); } 
}


文章来源: How can I ensure that an overridden method is synchronized