2012-01-24 8 views
1

私はJavaスレッドアプリケーションの初心者です教えてくださいプログラムの作成方法、すべてのスレッドアクセスマルチスレッドアプリケーションのオブジェクトの同じリストですか?複数のスレッドで同じarraylistにアクセスする方法

読みやすいリンクがありますか?

+0

まずはアクセスは何ですか?配列のリストを読みたいだけでなく、複数のスレッドを使って配列リストを書きたいのですか? – Sap

+0

@Grrrr – Boni

+0

を読み書きしたい場合は、これが参考になりますhttp://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#synchronizedList(java.util。リスト) – Sap

答えて

0

リストを同じインスタンスでアクセスするか、staticにして、リストをスレッドセーフにするにはSynchronizedにしてください。

0

staticリストを使用すると、いつでも1つのコピーしか存在しないようにすることができます。また、スレッドセーフな同期化メソッドを使用するようにしてください。

0

すべてのスレッドからリストの同じインスタンスにアクセスするには、静的にします。例:次に

private static List myList; 

(競合を避けるように一つだけスレッドは、一度にアクセスできるように、すなわちそれを作る)アクセス方法は、スレッドセーフにします。例:

public static synchronized updateList(String parameters) { 
    // Do something 
} 
1

Collectionsクラスの関連するメソッドを使用することで、リスト(または任意のコレクション)がスレッドセーフであることを確認できます。

the APIより:

public static <T> List<T> synchronizedList(List<T> list) 
    Returns a synchronized (thread-safe) list backed by the specified list. 

static List mySharedList = Collections.synchronizedList(new ArrayList()); 
0

についてはい、すべてのスレッドは、任意のオブジェクト(込みクラス)の同じインスタンスにアクセスするできます。メモリ空間は、アプリケーションごと(すなわち、プロセスごとに)作成されるためです。プロセスには、内部のすべてのスレッドが含まれます。暗黙的な 'メイン'のもので、共有メモリ空間を持ちます。

オブジェクトが1つのスレッドのみで使用されている場合は、並行性の問題はありません。同期の必要はありませんが、スレッド間で何かを共有しなければならないことがあります。読み取りと書き込みの両方を少数のスレッドで同時に実行できる場合は、いわゆる「レース」に対処するためにこのオブジェクトで同期する必要があることを意味します。

共有オブジェクトがスレッドセーフになるためにフィールドをstaticとして作成する必要はありません。必要であれば、このオブジェクトをパラメータとして、Threadクラスを継承するクラスに渡すことができます(または、匿名クラスの場合などは、クラスを囲むメソッドのローカル変数でもよい)

このオブジェクトで同期するだけです。あなたは明示的にメソッド内で同期することができます:

synchronized (obj) { 
    // doing a thread-safe stuff 
} 

か、そのような方法修飾子を使用して、完全にOBJのクラスのメソッド​​を作ることができます。この場合には次のようにメソッドの呼び出しで暗黙的に、自動的に同期されます「(本)同期{..}」ブロック:読み出し用として

public void synchronized methodFoo() { 
} 

、I「は、一言でJavaを」読み取り、章5.7 。 "スレッドと並行性"。 Javaのすべてのマルチスレッドの可能性の概要のために、私にとって非常に役に立ちました。

オンラインリソースの中では、公式のSun/Oracleのチュートリアルは、初心者のために役立つかもしれません:http://docs.oracle.com/javase/tutorial/essential/concurrency/(既に別の回答で言及されています)。

関連する問題