1

在子类或调用者函数中扩展临界区时如何调用?

假设class A有同步方法m1m2

class A {
 public synchronized void m1() {}
 public synchronized void m2() {}
}

Andclass B extends Am3同时使用m1andm2和 的方法也被同步

class B extends A {
 public synchronized void m3() { 
      ...
      m1();
      ...
      m2();
      ...
 }
}

如果m3希望在调用m1和之间保持状态不变,则可能需要这样做m2

问题是关于术语的。

这叫什么?

4

2 回答 2

1

如果在执行流程上有一个锁层次结构 - 层次结构中的锁称为嵌套锁。它们可以是可重入的或不可重入的。

如果单个操作是线程安全的,则在这种情况下是m1()m2(),但是控制流取决于先前操作的结果的操作序列可能会受到数据竞争的影响——这称为条件线程安全

于 2013-01-30T06:15:13.523 回答
0

我敢肯定,这种情况没有专门的术语。此外,我看不到您实际上在哪里扩展子类中的关键部分。

我认为,这只是称为“在子类的新方法中调用超类的方法”。没有其他的。这与同步无关。

升级版:

实际上,您所做的是这样的代码:

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- 是不必要且毫无意义的事情。

于 2013-01-29T11:14:54.127 回答