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

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

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

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

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

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

 // I hate synchronizing on "this" private final Object lock = new Object(); public final void foo() { synchronized(lock) { fooImpl(); } } protected abstract void fooImpl(); 

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

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

 synchronized void foo() { body } 

被定义为等同于

 void foo() { synchronized(this) { body } } 

(如果是静态的,在类上同步而不是this

由于抽象方法没有主体,因此未定义方法上的synchronized关键字。

我认为背后的一个逻辑可能是,是否同步该方法应该由实现类决定。 这意味着,它为实现者提供了选择是否提供同步或不同步实现的自由。 此外,客户端还可以选择不同步的版本,以便在线程安全不成问题时避免同步开销。