Java 開発では、特に同時実行性の高いシナリオでは、キャッシュ テクノロジが非常に重要です。合理的なキャッシュ設計により、システム パフォーマンスが大幅に向上し、サーバー リソースが節約されます。キャッシュ内のデータの場合、特にマルチスレッド環境では、キャッシュされたデータの正確性と信頼性が特に重要です。したがって、この記事では、一般的なキャッシュ テクノロジであるキャッシュ データ ロックを紹介します。
1. キャッシュされたデータをロックする必要があるのはなぜですか?
アプリケーションでは、キャッシュはシステムのパフォーマンスを維持および向上させるための重要な部分です。ただし、複数のスレッドがキャッシュされたデータに同時にアクセスする場合は、キャッシュされたデータの正確性と信頼性を確保する方法を考慮する必要があります。
たとえば、アプリケーションにキーワード検索機能があり、ユーザーがキーワードを入力すると、対応するデータがキャッシュから検索され、クエリ結果が返されます。ユーザー。 。同時実行性が高い状況で、複数のスレッドが同時に同じキーワード データをリクエストし、そのデータがキャッシュにヒットしないと仮定すると、複数のスレッドが同時にデータベースをリクエストし、データベース クエリ操作が繰り返される可能性があります。サーバーやリソースの無駄が発生し、返されるクエリ結果も異なる可能性があり、最終的にはビジネス ロジック エラーにつながります。
上記の状況を回避するには、複数のスレッドによる同時アクセスによって引き起こされるデータの不整合を避けるために、キャッシュ内のデータをロックして、1 つのスレッドのみが同時に読み取りおよび書き込み操作を実行できるようにする必要があります。 。
2. キャッシュされたデータのロックを実装する方法
Java では、同期キーワード Lock を使用して共有変数を追加できます。キャッシュ テクノロジでは、同期を使用してキャッシュをロックし、1 つのスレッドのみがキャッシュに対して読み書きできるようにすることができます。
サンプル コードは次のとおりです。
public class Cache { private static Map<String, Object> cacheData = new HashMap<>(); // 缓存数据加锁 public static synchronized void put(String key, Object value) { cacheData.put(key, value); } // 缓存数据加锁 public static synchronized Object get(String key) { return cacheData.get(key); } }
上記のコードでは、synchronized を使用して put メソッドと get メソッドをロックし、1 つのスレッドのみが同時に読み取りおよび書き込み操作を実行できるようにしています。時間。
ロックに synchronized キーワードを使用することに加えて、ReentrantReadWriteLock 読み取り/書き込みロックを使用して、キャッシュされた読み取りおよび書き込み操作をロックすることもできます。 。同期を使用する場合と比較して、ReentrantReadWriteLock は読み取りおよび書き込み操作をより柔軟に制御できます。たとえば、複数のスレッドがキャッシュ内のデータを同時に読み取ることを許可して、システムの同時処理能力を向上させることができます。
サンプル コードは次のとおりです:
public class Cache { private static Map<String, Object> cacheData = new HashMap<>(); private static ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); // 缓存数据加写锁 public static void put(String key, Object value) { lock.writeLock().lock(); try { cacheData.put(key, value); } finally { lock.writeLock().unlock(); } } // 缓存数据加读锁 public static Object get(String key) { lock.readLock().lock(); try { return cacheData.get(key); } finally { lock.readLock().unlock(); } } }
上記のコードでは、ReentrantReadWriteLock を使用して put メソッドと get メソッドをロックしています。書き込み操作中に書き込みロックを取得する必要があります。読み取り操作はロックを取得するだけで済みます。
3. キャッシュデータのロックに関する注意事項
上記のキャッシュデータのロック方法に加えて、以下の点にも注意する必要があります。 # キャッシュ ロックの粒度は適切である必要があります。過度のロック スコープによるシステム パフォーマンスの低下を避けるために、ロックの粒度はできる限り小さくする必要があります。
以上がJava キャッシュ テクノロジでのキャッシュ データ ロックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。