如果你想防止同时执行你的 block 和 method isRunning()
,你不能完全按照你的意愿去做,因为synchronization
不能被继承(只有一个实现可以证明synchronization
)。
这是您可以做的最近的事情:
class A {
protected Object lock = new Object();
protected abstract int isRunning();
public void concreteMethod() {
synchronized(lock) {
//do stuff
}
}
}
class B extends A {
int running_ = 0;
public int isRunning() {
synchronized(lock) {
return running_;
}
}
}
如果您有能力锁定整个concreteMethod()
块而不仅仅是一个块,您可以使用简单的解决方案将synchronized
关键字添加到concreteMethod
and isRunning()
:
class A {
protected abstract int isRunning();
public synchronized void concreteMethod() {
//do stuff
}
}
class B extends A {
int running_ = 0;
public synchronized int isRunning() {
return running_;
}
}