W naszym systemie mamy metodę, która będzie popracować kiedy to się nazywa z określonym ID:Java: Synchronizacja na elementach pierwotnych?
public void doWork(long id) { /* ... */ }
Teraz ta praca może być wykonywana równolegle dla różnych identyfikatorów, ale jeśli metoda jest wywoływana z ten sam identyfikator przez 2 wątki, jeden wątek powinien blokować, dopóki nie zostanie ukończony.
Najprostszym rozwiązaniem jest posiadanie mapy mapującej z Long ID na dowolny obiekt, który możemy zablokować. Jednym z problemów, które przewiduję, jest to, że możemy mieć mnóstwo identyfikatorów w systemie, a mapa będzie nadal rosła każdego dnia.
Idealnie, myślę, że potrzebujemy systemu, w którym każdy wątek pobierze obiekt blokady, zablokuje, gdy będzie to możliwe, wykona pracę, a następnie zasygnalizuje, że skończyliśmy z zamkiem. Jeśli jest jasne, że nikt inny nie używa tej konkretnej blokady, to bezpiecznie usuń ją z mapy zamka, aby zapobiec wyciekowi pamięci.
Wyobrażam sobie, że to dość powszechny scenariusz, więc mam nadzieję, że istnieje istniejące rozwiązanie. Ktoś o tym wie?
W jaki sposób są generowane te numery identyfikacyjne? Jeśli jest jakiś pośrednik w tych identyfikatorach, po prostu rozdaj obiekty zamiast prymitywów i możesz ich użyć do blokowania/synchronizacji. –
Zobacz także http://stackoverflow.com/q/6616141/32453 – rogerdpack