Я работаю над параллельной проблемой, где критическая секция не оспаривается, потому что каждому потоку необходимо использовать какой-то общий ресурс, а потому, что какой-то поток должен это сделать, и он может быть только один. Проще говоря, потоки рады дождаться, пока кто-нибудь завершит работу, потому что (кроме затрат на переключение контекста) это их не замедляет, поскольку в противном случае им пришлось бы делать это самостоятельно. Это не разовый сценарий; потоки могут требовать разных «уровней завершения» непрерывной работы.
Классический Java-способ решения такой проблемы состоит в том, чтобы получить блокировку объекта с помощью sychronized, проверить состояние защищенных переменных и перейти в режим ожидания с ожиданием, если не будет удовлетворено. Затем поток, выполняющий фактическую работу, периодически вызывает notifyAll, чтобы сообщить им о проделанной работе. Однако это не идеальный вариант, поскольку каждому уведомленному потоку необходимо будет последовательно получить блокировку и проверить состояние, даже если все они могут быть разбужены одновременно и выполнить энергозависимое чтение переменной полностью одновременно.
Вторая, несколько связанная с этим проблема заключается в том, что стоимость парковки потока значительна; существуют ли реализации блокировки, которые оптимистично пытаются немного повернуть блокировку в надежде, что ресурс скоро станет доступен, прежде чем прибегать к спящему режиму?