Java での String オブジェクトの同期
Java で String オブジェクトの同期が問題となる理由を理解することが、遭遇した問題の根底にあります。デフォルトでは、String オブジェクトは参照によって渡されます。これは、同じ String オブジェクトへの参照がプログラムの異なる部分間で共有されることを意味します。これにより、複数のスレッドが同じ String オブジェクトに同時にアクセスしようとすると、予期しない動作が発生する可能性があります。
この問題を解決する鍵は、String オブジェクトをインターンすることで値ごとに一意であることが保証されることを理解することにあります。インターン文字列オブジェクトは Java 仮想マシン (JVM) 内のプールに保存され、その後同じ値を持つ文字列を作成しようとすると、新しいオブジェクトを作成する代わりに、インターン文字列への参照が返されます。これにより、JVM 内に各一意の String 値のインスタンスが 1 つだけ存在することが保証されます。
インターンされた String を使用すると、同期に使用するキーが一意になり、すべてのスレッドがそのキーへの参照を取得できるようになります。同じオブジェクト。これにより、期待どおりの動作が行われ、一度に 1 つのスレッドのみが同期ブロックに入り、get/set 操作を実行します。
String オブジェクトをインターンするには、 intern() メソッドを使用できます。以下に例を示します。
final String key = "Data-" + email; final String internedKey = key.intern();
キー文字列をインターンすることにより、そのキー文字列に対する一意のオブジェクトを作成します。その後、同じ値を持つ文字列を作成しようとすると、同じインターンされたオブジェクトが返されます。これにより、キーへの参照がすべてのスレッドで一貫していることが保証され、適切な同期が行われます。
以上がJava での文字列オブジェクトの同期に問題があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。