2012-03-24 7 views
2

私は、Javaアプリケーションの数百人のユーザーに永続変数(文字列と長整数)にアクセスする複数のスレッド(約40)を持っています。これらの変数を保存する最良の方法は何ですか?変数の読み書きはいつでも発生する可能性があります。CPU負荷を最小限に抑えるだけでなく、変数が書き込まれているために変数が使用できない場合の影響を減らしたいと考えています。複数のスレッド化と永続化のベストプラクティス

私は、各ユーザーのファイルを作成し、そのユーザーのすべての変数を文字列に変換し、変数が必要なときはいつでもそのファイルに書き込みをすることを考えています。

...各ユーザー(キー)ごとにHashMapを作成し、必要に応じて変数(値)を追加します。

これを行うスレッドセーフな方法はありますか?スレッドが変数を要求するたびに確実に正しい値を取得できるようにするには?

ありがとうございました。

+1

ロックと同期について聞いたことがありますか?編集:心に来る最初のリソース:http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html – Corbin

+0

私はそれを研究します。ありがとう。私が読むことができる他のリソース? – rob345

+0

彼らの多くは、私の頭の上から私が考えることができるものはありません。あなたはおそらくGoogleの周りに良い本のためのいくつかの裏書を見つけることができますか、またはあなたの周りにチュートリアルを見つけることができます。実際には、私が貼り付けたリンクは、文字列にアクセスすることが同時に起こる問題の領域では非常に簡単であるため、すべてのニーズをカバーする必要があります。 – Corbin

答えて

2

ご存知のとおり、私は手足の外に出て、ConcurrentHashMapを使用します。これはDisruptorを除いた多くの同時情報で競合を最小限に抑える最良の方法の1つです。とにかくHashMapを検討しているので、発生するロックは個々のハッシュ行に限定されています。つまり、異なる領域にハッシュする2つの項目は互いにブロックしません。

+0

ベスト・アンサー、ConcurrentHashMapがうまくいっているようです。ありがとう。 – rob345

0

変数を格納する必要がある場合(つまり、不揮発性)、ACID DBMS(MySQL、PostgreSQLなど)を使用し、DBMSに並行処理をさせるだけでよいと思います。

ほとんどのORMフレームワークでは、I/Oがパフォーマンス上の問題となることが懸念される場合、マルチスレッドセーフ(つまり、HibernateまたはMyBatis)である遅延読み取りメカニズムと読み取り/書き込みキャッシュの両方が提供されます。

関連する問題