Cóż, jeśli twoje łańcuchy są wystarczająco unikalne (np. wygenerowane przez hash kryptograficzny), synchronizacja na identyfikatorach klientów prawdopodobnie działa , o ile wywołasz String.intern()
na nich w pierwszej kolejności. Ponieważ identyfikatory są niepowtarzalne, prawdopodobnie nie napotkasz konfliktów z innymi modułami, chyba że przekażesz im swoje identyfikatory i stosują złą praktykę blokowania ich.
To powiedziawszy, to prawdopodobnie zły pomysł. Oprócz małej szansy, że pewnego dnia wpadnie w niepotrzebną rywalizację, jeśli ktoś inny zablokuje ten sam String
na przykład głównym problemem jest to, że musisz intern()
cały twój String
obiekty, a to często cierpi z powodu słabej wydajności z powodu natywnej implementacji tabeli intern ciągów, jej stałego rozmiaru itp. Jeśli naprawdę potrzebujesz blokady opartej tylko na String
, lepiej skorzystaj z Interners.newWeakInterner()
wewnętrzne wdrożenie, które prawdopodobnie będzie działać znacznie lepiej. Zapakuj swój ciąg w inną klasę, aby uniknąć kolizji na wbudowanym String
Zamek. Więcej szczegółów na temat tego podejścia w tej odpowiedzi
.
Poza tym często istnieje inny naturalny obiekt do zablokowania, taki jak blokada w obiekcie sesji itp.
Jest to bardzo podobne do tego pytania który ma bardziej rozbudowane odpowiedzi.
... lub przynajmniej mieć wystarczająco dużo bitów, aby kolizja była wystarczająco mało prawdopodobna i jeśli identyfikatory klienta nie są częścią Twojego powierzchnia ataku .