2011-02-03 3 views
0

私はコードを与えられました。ユーザー名とサービスタイプに基づいて一意のIDを作成します。 ユニークなIDはdbで、dbは私が見ることのできないDAOクラスを介して読み込まれます。 IDを作成するには多くの手順が必要です。Javaの同期とdbの値

create(user,service) { 
    id=getIdViaDAO(user,service) 
    if(id==null) { 
     create few classes and call few methods. 
     id=generareId(few objects) 
     session.setId(id) 
     dao.createSession(session) 
    } 
    return id 
} 

マルチスレッド環境では、一意のIDの保証はありません。私は、値としてキーやIDなどのuserId +サービスとのConcurrentHashMapにIDをキャッシュします:一意

ソリューションを保証するために

。メソッドが呼び出されるたびに私はキーが存在しない場合は値(id)をチェックし、idを作成します。これにより競合が軽減され、一意性が保証されます。

私の解決策に問題がある場合、および/またはこれにはより良い解決策がありますか?

+0

idはローカル変数 –

+1

です。同じユーザーとサービスでgetIdViaDAOを呼び出すと(1つのスレッドを使用して)何度も同じIDを取得できますか?さらに、他のユーザー+サービスの組み合わせでは別のIDが生成されますか? – chahuistle

答えて

0

同じユーザーとサービスで同じIDを指定する必要があります。気を付けるために物事のカップル:

  • ユーザIDおよびサービスは、hashCode()メソッドとequalsを(実装することを確認してください)適切
  • 全体のcreate()メソッドの周りの同期()ロックを持っていることを確認してください