2012-03-16 11 views
0

Javaの「ベストプラクティス」に関する簡単な質問。データベースのプライマリデータ構造をマップとして持つデータベースオブジェクトがあるとします。さらに、マップの取得/設定情報を同期させたいとします。マップにアクセス/変更するすべてのメソッドを同期させる方が良いですか、変更/アクセスするたびにマップの周りに同期ブロックを作成したいですか?データベースとの同期

+1

あなたは概念的な意味でデータベースを意味しますか?またはSQLデータベースのようなデータベースですか? – corsiKa

+0

概念的な意味、私はそれを明確にすべきだった... – Sal

+0

実際には、これに対する答えは私の質問の後者の提案だと思う。理論的には、いくつかのメソッドが同期されていても、異なるメソッドが同時に起動され、マップが変更される可能性があります。 – Sal

答えて

2

アトミックでなければならない作業単位の範囲によって異なります。単一の状態変更を表す複数の操作を実行するプロセスがある場合、そのプロセス全体をMapオブジェクトで同期させたいとします。個々の操作を同期させる場合、複数のスレッドが読み取りと書き込みの際に相互にインターリーブすることができます。これは、読み取りコミットされていないモードでデータベースカーソルを使用するようなものです。不完全/間違ったデータ状態を見て、他のいくつかのスレッドの半分の作業に基づいて決定を下すかもしれません。

(そしてもちろん、代わりにsynchronizedキーワードのjava.util.concurrent.locksからクラスを使用する義務の提案を挿入:))

1

一般的には、private synchronizedの方法よりもプライベート以外の方法では、private final Objectで同期することをお勧めします。これの根拠は、ルージュの呼び出し元がメソッドに入力を渡してロックを取得したくないということです。 privateメソッドでは、メソッドの呼び出し方法を完全に制御できます。

個人的には、私は​​メソッドを避け、ブロックをsynchronized()ブロックにカプセル化します。これにより、より厳密な制御が可能になり、外部の情報源が自分のモニターを盗むのを防ぐことができます。私はあなたのモニターへの外部ソースアクセスを提供したい場合を考えることはできませんが、そうした場合は、ロックオブジェクトに同じものを渡すことができます。しかし、私が言ったように、私はそれを避けるだろう。

関連する問題