Java での String オブジェクトの同期
String オブジェクトを使用したマルチスレッド アプリケーションでの操作の同期は、複数のインスタンスが存在するため課題が発生する可能性があります。同じ文字列値です。目的のキャッシュ キーで適切な同期を確保するには、String オブジェクトで intern() メソッドを使用することが不可欠です。
final String key = "Data-" + email; final String internedKey = key.intern(); synchronized(internedKey) { ... }
intern() メソッドは文字列の正規表現を返し、すべての参照が保証されます。その文字列値に同じオブジェクトを参照します。これにより、複数のスレッド間で一貫した同期が可能になります。
ただし、インターンされた文字列での同期では、パフォーマンスに関する新たな考慮事項が発生する可能性があります。内部的には、VM はインターン プロセス中にロックを取得する可能性があり、パフォーマンスの低下を引き起こす可能性があります。
潜在的な問題を軽減するには、キー自体ではなく、各キーに関連付けられたロック オブジェクトの使用を検討してください。このアプローチにより、インターニング文字列に関連する潜在的なオーバーヘッドが回避されます。
Map<String, Object> lockMap = new HashMap<>(); Object lock = lockMap.get(key); if (lock == null) { lock = new Object(); lockMap.put(key, lock); } synchronized(lock) { ... }
このアプローチでは、各キーが一意のロック オブジェクトに関連付けられ、一度に 1 つのスレッドのみが対応するキャッシュ操作にアクセスできるようになります。
以上がJava で文字列オブジェクトを同期する理由と方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。