在子类或调用函数中扩展临界区时如何调用它?
假设class A
已同步方法m1
和m2
class A {
public synchronized void m1() {}
public synchronized void m2() {}
}
class B extends A
方法m3
同时使用m1
和m2
并同步
class B extends A {
public synchronized void m3() {
...
m1();
...
m2();
...
}
}
如果m3
希望在调用m1
和m2
之间保持状态不变,则可能需要这样做。
问题在于术语。
它叫什么?
答案 0 :(得分:1)
如果执行流程上存在锁定层次结构 - 层次结构中的锁定称为 嵌套锁定 。它们可以是重入的或不可重入的。
如果个别操作是线程安全的, m1() 和 m2() ,在这种情况下,但是控制流取决于先前操作结果的操作序列可能会受到数据竞争的影响 - 它被称为 条件线程安全 。
答案 1 :(得分:0)
我确定,这种情况没有特殊用语。此外,我无法看到,您实际上在子类中扩展关键部分。
我认为,这只是在子类" 中调用"在新方法中调用超类的方法。没有其他的。这不是同步。
<强> UPD:强>
实际上,你所做的就是这样的代码:
class B extends A {
public void m3() {
synchronized (this) {
...
synchronized (this) {
//m1();
... m1 source...
}
...
synchronized (this) {
//m2();
... m2 source...
}
...
}
}
}
绝对等同于:
class B extends A {
public void m3() {
synchronized (this) {
...
//m1();
... m1 source...
...
//m2();
... m2 source...
...
}
}
}
即。对同一对象上synchronized
块内的同一对象进行内部同步 - 是不必要且毫无意义的事情。