文字列が十分に一意である場合(たとえば、暗号化ハッシュを介して生成された場合)、クライアントIDでの同期はおそらく動作します 、String.intern()
を呼び出す限り それらに最初に。 IDは一意であるため、IDを他のモジュールに渡さない限り、他のモジュールと競合する可能性はほとんどありません。 彼らは彼らをロックするという悪い習慣に従います。
そうは言っても、それはおそらく悪い考えです。他の誰かが同じString
をロックした場合、ある日不必要な競合が発生する可能性がわずかにあります。 たとえば、主な問題は、intern()
を実行する必要があることです。 すべてのString
オブジェクト。これは、文字列インターンテーブルのネイティブ実装、固定サイズなどが原因でパフォーマンスが低下することがよくあります。本当にString
のみに基づいてロックする必要がある場合 、Guavaの Interners.newWeakInterner()
インターネットの実装。パフォーマンスが大幅に向上する可能性があります。組み込みのString
との衝突を避けるために、文字列を別のクラスでラップします ロック。そのアプローチの詳細
それ以外にも、セッションオブジェクトのロックなど、ロックする別の自然なオブジェクトが存在することがよくあります。
これは、この質問 と非常によく似ています。 より具体的な答えがあります。
...または、少なくとも、衝突の可能性を十分に低くするのに十分なビットがあり、クライアントIDが攻撃対象領域 。