为什么抽象方法不能同步?

aho*_*der 26 java inheritance multithreading abstraction synchronized

我正在从CodeRanch读取一个线程,说抽象方法无法同步,因为抽象类无法实例化,这意味着没有锁定对象.

这没有意义,因为抽象类是子类的定义(契约).对于同步方法的抽象定义不需要锁定,而子进程则需要.所有抽象标题都表明孩子必须同步这个方法.我的逻辑是否正确?如果没有,有人可以解释为什么我错了吗?

Jon*_*eet 32

关于无法实例化抽象类的注释是垃圾.鉴于它必须是一个抽象的实例方法,肯定一个可以锁定的引用.抽象类中的具体方法仍然可以参考this.但是,这仍然不意味着抽象类应该能够同步.

方法是否同步是该方法的实现细节.没有在任何地方指定同步作为声明性合同 - 它也不像你可以在接口中同步.

一个类如何实现它提供的任何线程安全保证取决于它.如果抽象类想要强制使用特定方法,则应使用模板方法模式:

// I hate synchronizing on "this"
private final Object lock = new Object();

public final void foo() {
    synchronized(lock) {
        fooImpl();
    }
}

protected abstract void fooImpl();
Run Code Online (Sandbox Code Playgroud)

这本身就很危险,因为它在锁中有效地调用了"未知"代码,这是一个死锁的处方等.

  • 谢谢你的答案.在假定抽象类应该支持同步方法调用时,我没有想到死锁. (2认同)
  • @Debdeep:我不确定你的意思。如果它是针对特定实现的,您只需确保实现做到这一点。如果您的意思是要强制特定抽象方法的每个实现都是同步的,则不能。 (2认同)

Nat*_*hes 8

对不起它没有意义,这就是它的工作原理.无法使用抽象方法或接口方法指定锁定行为,它不是合同的一部分.可能的想法是锁定行为从根本上是实现的一部分 - 不同的实现将希望以不同的方式执行锁定 - 并且在该抽象级别指定它将是过度的.