Блокировка / мониторинг / расширение критического раздела?

Как он вызывается, когда критическая секция расширяется в подкласс или вызывающую функцию?

Предположим, что 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.

Вопрос в терминологии.

Как это называется?


person Suzan Cioc    schedule 29.01.2013    source источник


Ответы (2)


Если в потоке выполнения есть иерархия блокировок - блокировки из иерархии называются вложенными блокировками. Они могут быть повторно входящими или не входящими.

Если отдельные операции являются потокобезопасными, в этом случае m1 () и m2 (), но последовательности операции, поток управления которых зависит от результатов предыдущих операций, могут подвергаться гонкам данных - это называется условной безопасностью потоков.

person Andrey Taptunov    schedule 30.01.2013

Я уверен, что для этой ситуации нет специального термина. Более того, я не вижу, где вы на самом деле расширяете критическую секцию в подклассе.

Я думаю, это просто называется «вызов метода суперкласса внутри нового метода в подклассе». Ничего больше. Дело не в синхронизации.

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 блока на том же объекте - вещь лишняя и бессмысленная.

person Andremoniy    schedule 29.01.2013
comment
Извините, но речь идет о синхронизации. В суперклассе у меня есть 2 небольших критических раздела, а в подклассе - большая, с меньшими внутри. Т.е. поток находится в критической секции более длительное время. - person Suzan Cioc; 29.01.2013
comment
@SuzanCioc Я обновил свой ответ. Может быть, будет более понятно, что я имею в виду под своим объяснением. - person Andremoniy; 29.01.2013
comment
@ Андрей, это неправда! Один критический раздел - это нечто совершенно иное, чем два меньших (даже без кода между ними, как в этом примере). - person Dariusz; 29.01.2013
comment
@Andremoniy это зависит от контракта. Подкласс может поддерживать более мелкие критические секции, чем суперкласс или контейнер. - person Suzan Cioc; 29.01.2013
comment
SuzanCioc и @DariuszWawer, если вы хотите, чтобы критические секции суперкласса были независимыми от критических секций подкласса, тогда вам нужно использовать разные мониторы. Если вы используете тот же монитор, что и в вашем примере, тогда утверждения Андремони действительно применяются с добавлением, что вызовы m1 () и m2 () будут заблокированы, пока какой-то поток работает m3 () - person hidralisk; 29.01.2013