В ходе собеседования мне был задан вопрос о параллелизме, который в конечном итоге сводился к следующим требованиям.Я смог достичь от № 2 до № 4 просто с помощью взаимного исключения, но не № 1.
Разработка очереди задач с использованием следующих методов:
public void registerCallback(Runnable task)
public void eventFired()
- Несколько потоков должны иметь возможностьчтобы поставить задачи в очередь, возможно, одновременно.
eventFired
должен вызываться только один раз. - Если
eventFired
был вызван ранее, любой последующий вызов любого из методов должен вызвать исключение. - Если
eventFired
вызывается во время выполнения registerCallback
, отложить событие на более позднее время. - Если
registerCallback
вызывается во время выполнения eventFired
, броситьисключение.
ReentrantReadWriteLock
кажется многообещающим, потому что registerCallback
может получить блокировку чтения и eventFired
блокировку записи, но это не решает условия гонки, где registerCallback
вызывается, а затем eventFired
.
Есть идеи?