抽象类中的同步

时间:2017-08-04 19:32:05

标签: java inheritance synchronization

我正在研究Java Event Manager,我想为它添加新的未来。 它是自定义类选择,或自定义匹配类系统。

EventManager eventManager = new EventManager();

如何将新的类选择器设置为事件管理器:

eventManager.setClassSelector(Class<? extends ClassSelector> classSelector);
eventManager.setClassSelector(ClassSelector classSelector);

使用类选择器的方法:

eventManager.callEvent(event);

有ClassSelector的结构

public abstract class ClassSelector{
    public List<Class<?>> classSelection(Class<?> clazz);
}

ClassSelector中的方法 classSelection 必须同步,因为callEvent使用的ThreadPool包含多个Threads且只有一个ClassSelector实例。

但同步关键字不是从超类继承的。我需要建议,如何通过改变代码或改变逻辑来解决这个问题。

2 个答案:

答案 0 :(得分:3)

这很简单:当你的抽象基类需要以某种方式“限制”某个方法时(比如:你想强制执行该方法是synchronized) - 那么方法不应该是抽象的。

而是实现该方法并使其成为最终

public abstract class ClassSelector{
   public final synchronized List<Class<?>> getClassSelection(Class<?> clazz) {
     return getSpecificClasses(clazz);
   }

   protected abstract List<Class<?>> getSpecificClasses(Class<?> clazz);

现在很明显,您的类的用户应该调用该公共方法 - 并且每个子类只能实现在同步中调用保证的内容方式。

(方法命名并不是很好 - 只是作为例子)

答案 1 :(得分:2)

你可以使classSelection成为一个真正的方法,它调用一个抽象方法。然后,每个子类只提供抽象方法的实现。这可能看起来像这样。

public abstract class ClassSelector{
    public synchronized final List<Class<?>> classSelection(Class<?> clazz) {
        return doClassSelection(clazz);
    }
    protected List<Class<?>> doClassSelection(Class<?> clazz);
}

final会阻止某人覆盖您的限制,并实施他们自己的classSelection非同步版本。