Om dina strängar är tillräckligt unika (t.ex. genererade via en kryptografisk hash) kommer synkronisering på klient-ID:n förmodligen att fungera , så länge du anropar String.intern()
på dem först. Eftersom ID:n är unika kommer du sannolikt inte att stöta på konflikter med andra moduler, om du inte råkar skicka in dina ID:n till dem och de följer den dåliga vanan att låsa fast dem.
Som sagt, det är nog en dålig idé. Förutom den lilla chansen att en dag råka ut för onödiga konflikter om någon annan låser på samma String
Exempelvis är huvudproblemet att du måste intern()
all din String
objekt, och detta lider ofta av dålig prestanda på grund av den inbyggda implementeringen av stränginterntabellen, dess fasta storlek, etc. Om du verkligen behöver låsa endast baserat på en String
, det är bättre att använda Guavas Interners.newWeakInterner()
intern implementering, som sannolikt kommer att prestera mycket bättre. Slå in din sträng i en annan klass för att undvika att stöta på den inbyggda String
låsa. Mer information om det tillvägagångssättet i det här svaret
.
Utöver det finns det ofta ett annat naturligt objekt att låsa på, såsom ett lås i ett sessionsobjekt, etc.
Detta är ganska likt denna fråga som har mer utförliga svar.
... eller åtminstone ha tillräckligt med bitar för att göra kollision osannolik nog och om dina klient-ID inte är en del av din attackyta .