ホームページ > Java > &#&チュートリアル > Java で文字列オブジェクトの同期が常に機能しないのはなぜですか?

Java で文字列オブジェクトの同期が常に機能しないのはなぜですか?

Patricia Arquette
リリース: 2024-11-14 13:32:02
オリジナル
1046 人が閲覧しました

Why Doesn't Synchronizing on String Objects in Java Always Work?

Java で文字列オブジェクトを同期する方法

Java で同時実行性を実装する場合、さまざまな種類のオブジェクトでの同期の結果を理解することが重要です。オブジェクト。この記事では、String オブジェクトの同期時に発生する一般的な問題を検討し、効果的な同期を確保するための解決策を提供します。

問題

提供されたシナリオには、キャッシュを使用して応答を保存する Web サービスが含まれます。特定のエンドポイント。目的は、キャッシュされたオブジェクトの有効期限が切れた場合に、1 つのスレッドだけが Web サービスを呼び出すようにすることでした。これを実現するために、コードは String オブジェクトであるキャッシュ キーで同期しました。ただし、複数のスレッドが同時に同期ブロックに入ったため、同期は期待どおりに機能していないようです。

解決策: String のインターニング

コード例の問題は、String のインスタンスが同じ値を持つオブジェクトは、必ずしも同じオブジェクトであるとは限りません。したがって、文字列連結 (「データ」電子メール) を使用してキャッシュ キーを作成すると、キーごとに新しい String オブジェクトが作成されます。これは、同じ値を持つにもかかわらず、コードが実際には異なる String オブジェクトで同期していたことを意味します。

これを解決するには、String オブジェクトで intern() メソッドを使用できます。 intern() メソッドは、文字列の正規表現を返します。これは、Java 仮想マシン (JVM) 内でその文字列が出現するすべての場合に使用される単一のインスタンスです。正規表現を使用すると、すべてのスレッドが同じ String オブジェクトで同期され、適切な同期が確保されます。

インターンを使用した例

文字列インターンメントを使用した更新されたコード:

private SomeData[] getSomeDataByEmail(WebServiceInterface service, String email) {

  final String firstkey = "Data-" + email;
  final String key = firstkey.intern();
  
  synchronized(key) {
    // Rest of the original code
  }
}
ログイン後にコピー

結論

intern() を使用して、すべての String オブジェクトが正規表現で表現されるようにすることで、提供されたコードの同期メカニズムを有効にすることができます。同じ値を持つオブジェクトの異なるインスタンスを同期すると同期エラーが発生する可能性があり、 intern() を使用するとこの問題を防ぐことができることに留意することが重要です。

以上がJava で文字列オブジェクトの同期が常に機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート