2017-01-14 5 views
1

CRUD操作のある小さなWebアプリケーションがあります。データの場合、私はdbを使うことができないので、マップやそれに類似したデータ構造に格納する必要があります。この要件に基づいて、私はデータを格納しアクセスするために2つのマップが必要であり、それらが互いに同期していることを確認する必要があります。 ここでは、マルチスレッド環境で2つのマップ上でcrud操作を行い、それらが一貫性のある状態になっていることを確認するための好ましい方法は何ですか?ロックや同期を避けるためのより良いアプローチやパターンはありますか?アプリケーションサーバーのJava同時実行性

ありがとうございました

答えて

0

私はいくつかの同期が必要と考えています。次のアプローチを試すことができます。 まず、どちらのマップにもConcurrentHashMapを使用してください。次に、両方のマップを、データが一貫性のある状態になるようにメソッドを同期させるオブジェクトにカプセル化します。

public class ParentMap { 
    private ConcurrentHashMap<String, Object> map1 = new ConcurrentHashMap<>(); 
    private ConcurrentHashMap<String, Object> map2 = new ConcurrentHashMap<>(); 

    public synchronized void add(Object objectToAdd) { 
     // Add to map1 
     // Add to map2 
    } 

    public synchronized void update(String key, Object object) { 
     // Update the object based on the key on both maps (following the rules of your application) 
    } 

    public synchronized void delete(String key) { 
     // Delete in both maps following the rules of your application 
    } 

    public Object get(String key) { 
     // Use the rules of your application to read 
    } 
} 

アプリケーションで唯一ParentMapオブジェクトがあることを確認します。以下は一例です。このためにシングルトンパターンを使用することができます。

+0

こんにちは、返信いただきありがとうございます。それも私が考えていることです。しかし、代替のロックフリーアプローチがあるのだろうかと思います。 – Imran

+1

ロックしていないアプローチがないと思っていないと、矛盾した状態になります。データベースを使用する場合でも、背後にはいくつかのロックがあります。 mysqlをRDBMの例として使用すると、テーブルレベルのロックまたは行レベルのロックが行われます。 mongodbなどのnosqlデータベースの場合、コレクションレベルのロックまたはドキュメントレベルのロックがあります。 – Kihats

関連する問題