2011-08-09 14 views
2

モデルがあります。これは実際にはオブジェクトのArrayListです。 また、私はそれに対処する方法も持っています。 remove()、find()、getAll()、create()、add()、loadFromFile()、storeInFile()などです。モデルのJava同期

このモデルはさまざまなクライアントによって使用されています。彼らは両方ともこのリソースへの参照を持っています。同期しないでモデルを変更できるようにしても問題ありませんか?同時に、特定のメソッドを呼び出すことができます。

どのように同期する必要がありますか?メソッドやコレクションを同期させる必要がありますか?

答えて

-1

ArrayListからVectorに変更するだけで十分です。ベクトルはスレッドセーフな実装者でjava.util.Listです。それは最も速くはないにしてもスレッドセーフにする最も簡単な方法のようです。

+2

これは最も速い変更ですが、明示的に同期を示していません。プログラマには負担がかかります:暗黙的な同期の使用のために使用されているコレクションを変更しないことです。 synchronizedキーワードを使用して、モデルのAPIのレベルのレベルを同期させる方がよいでしょう。 – Atreys

+0

'Vector'は廃止されたと見なされます。http://stackoverflow.com/questions/1386275/why-java-vector-class-is-considered-obsolete-or-deprecated – Qwerky

+1

Vectorクラスを使用する理由は、リストのオブジェクト内でアクセスを同期するか、Collections.synchronizedListでラップされたArrayListなど、コレクションから新しい推奨クラスの1つを使用します。後者は、[ArrayList API](http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html)でよく記述されています。 –

2

これは依存しています。たとえば、コレクションに新しいオブジェクトを追加するなど、以前の方法よりも長いロジックを使用する場合は、メソッドレベルで操作を同期することをお勧めします。もちろん、ArrayListをスレッドセーフなコレクションに変更するよりも時間がかかりますが、前にいくつかの操作を行うと、コレクションに入れられたデータが古いものではないことを確認することができます。

もちろん、他のケースでは、内部コレクションの同期がはるかに優れたソリューションです。

2

同期化せずにモデルを変更することはできますか?

no。共有リソースの場合、クライアントは一貫性のないビューを持ちます。これは単にが受け入れられないです。

どのように同期する必要がありますか?

キーワード​​を使用してください。

メソッドやコレクションを同期させる必要がありますか?

コレクションではなく、メソッドを同期することをお勧めします。たとえば、

public void add(Object o){ 
    synchronized(foo){ 
     foo.add(o); 
    } 
} 

ここで、fooはあなたのコレクションです。


詳細については、以下を参照してください。

0

あなたは、モデル内の各メソッドについて考え、でメソッドを呼び出す複数のスレッドの影響を考慮する必要があります同じ時間、そして結果は何か。結果が悪い場合は、同期を使用してください。あなたのモデルの背後にあるロジックを知らなくても、誰もあなたに正しい答えを与えることはできません。