Управление доступом для двух методов в многопоточности, когда один неблокирует, а другой должен ждать первого - PullRequest
0 голосов
/ 19 сентября 2019

Мой класс является одноэлементным, и есть два метода A и B, которые требуют некоторого контроля доступа со следующими условиями:

  1. Вызов метода A всегда разрешен
  2. Вызов метода Bпока поток выполняет метод B, он должен ждать
  3. вызов метода B, когда поток выполняет метод A, должен ждать
  4. когда поток, вызывающий метод B, ожидает, пока поток завершит метод A, нужно только дождаться завершения этого потока, а не последующих вызовов

например

T1->A(.....) T1 call A
 T2->B~~~~~~() T2 has to wait for T1 only to finish A, no need to wait for T3 nor T5
  T3->A(.) T3 can call A
   T4->B~~~~~~() T4 has to wait for T1, T2 and T3, no need to wait for T5
     T5->A(........) T5 can call A
        T6->B~~~~~~~() T6 has to wait for T2, T4 and T5

У меня есть следующий псевдокод:

public void A() {
  i++;
  .....
  condition(i).signalAll();
}

public void B() {
  int iLocal = i;
  for all condition(i) <= iLocal, await
  lockB.lock()
  ...
  lockB.unlock();
}

Iя думаю, что использование условия может быть в состоянии достичь того, что я описал выше?Или есть другие лучшие способы добиться того же?

...