Pokud jsou vaše řetězce dostatečně jedinečné (např. generované pomocí kryptografického hashe), synchronizace na klientských ID pravděpodobně funguje , pokud zavoláte String.intern()
nejprve na nich. Vzhledem k tomu, že ID jsou jedinečná, není pravděpodobné, že se dostanete do konfliktu s jinými moduly, pokud jim svá ID náhodou nepředáte a dodržují špatnou praxi zamykání.
To znamená, že je to pravděpodobně špatný nápad. Kromě malé šance, že se jednoho dne dostanete do zbytečného sporu, pokud někdo jiný zamkne stejný String
instanci, hlavním problémem je, že musíte intern()
všechny vaše String
objektů, a to často trpí špatným výkonem kvůli nativní implementaci intern tabulky řetězců, její pevné velikosti atd. Pokud opravdu potřebujete uzamknout pouze na základě String
, je lepší používat Guava's Interners.newWeakInterner()
interní implementace, která bude pravděpodobně fungovat mnohem lépe. Zabalte svůj řetězec do jiné třídy, abyste předešli střetu s vestavěným String
zámek. Další podrobnosti o tomto přístupu v této odpovědi
.
Kromě toho často existuje další přirozený objekt, na který lze uzamknout, jako je zámek v objektu relace atd.
To je docela podobné této otázce který má podrobnější odpovědi.
... nebo alespoň mít dostatek bitů, aby kolize byla dostatečně nepravděpodobná, a pokud vaše ID klientů nejsou součástí vašeho útočný povrch .