В нашей системе есть метод, который будет выполнять некоторую работу, когда он вызывается с определенным идентификатором:
public void doWork(long id) { /* ... */ }
Теперь эта работа может выполняться одновременно для разных идентификаторов, но если метод вызывается с одинаковым идентификатором двумя потоками, один поток должен блокироваться до его завершения.
Самым простым решением было бы иметь карту, которая сопоставляет длинный идентификатор с каким-либо произвольным объектом, который мы можем заблокировать. Одна проблема, которую я предвижу, заключается в том, что в системе может быть множество идентификаторов, и эта карта будет расти с каждым днем.
В идеале, я думаю, нам нужна система, в которой каждый поток будет извлекать объект блокировки, блокировать, когда это возможно, выполнять работу, а затем сигнализировать, что мы сделали с блокировкой. Если ясно, что никто другой не использует эту конкретную блокировку, безопасно удалите ее из карты блокировок, чтобы предотвратить утечку памяти.
Я полагаю, что это довольно распространенный сценарий, поэтому я надеюсь, что существует существующее решение. Кто-нибудь знает что-нибудь?