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