有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何确保重写的方法是同步的

我有一类线程安全的通用代码

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

我需要确保或至少向其他开发人员表明,该方法的所有实现都需要是线程安全的

最好的方法是什么

有没有这样的关键字或注释

我已经尝试过abstract synchronized,但不允许这种关键字组合


共 (3) 个答案

  1. # 1 楼答案

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

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

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

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

  2. # 2 楼答案

    This link to the JLS证实了我们不能将抽象和同步混为一谈

    虽然比关键字或标准注释弱得多,但比文档强得多:也许试试Marker interface

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

    这是一个延伸,但可能会有所帮助,因为派生类会做出声明(edit:new example测试声明):

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