Как спроектировать очередь задач с взаимоисключающими, но независимо параллельными методами? - PullRequest
0 голосов
/ 09 июня 2019

В ходе собеседования мне был задан вопрос о параллелизме, который в конечном итоге сводился к следующим требованиям.Я смог достичь от № 2 до № 4 просто с помощью взаимного исключения, но не № 1.

Разработка очереди задач с использованием следующих методов:

public void registerCallback(Runnable task)

public void eventFired()

  1. Несколько потоков должны иметь возможностьчтобы поставить задачи в очередь, возможно, одновременно.
  2. eventFired должен вызываться только один раз.
  3. Если eventFired был вызван ранее, любой последующий вызов любого из методов должен вызвать исключение.
  4. Если eventFired вызывается во время выполнения registerCallback, отложить событие на более позднее время.
  5. Если registerCallback вызывается во время выполнения eventFired, броситьисключение.

ReentrantReadWriteLock кажется многообещающим, потому что registerCallback может получить блокировку чтения и eventFired блокировку записи, но это не решает условия гонки, где registerCallback вызывается, а затем eventFired.

Есть идеи?

...