How can I ensure that an overridden method is synchronized

我只是一个虾纸丫 提交于 2019-12-02 21:16:56

You can't do it directly. One thing you can do is have the method be concrete, but invoke an abstract method:

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

That way, doFoo() will always* be invoked under the synchronization established by foo().

* unless someone invokes it directly, so you should name and document it to make it clear that they shouldn't.

Amarnath

From Synchronized method in subclass

Synchronized is the implemenation detail of a method. You can override a sync method with a method without declaring that as sync and vice versa. The same holds true for the overloading also.

You can also have a look at, A synchronized method in the superclass acquires the same lock as one in the subclass.

This link to the JLS confirms that we can't mix abstract and synchronized.

Though much weaker than a keyword or standard annotation, but stronger than documentation: perhaps try a Marker interface?

... provides a means to associate metadata with a class where the language does not have explicit support for such metadata.

This is a stretch, but might help, in that the derived class makes a declaration (edit: new example tests the declaration):

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(); } 
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!