1

javaの同期ステートメントは、同期ステートメントなしでスレッドにアクセスしている他のスレッドで同期されたオブジェクトの変更から保護しますか? 私はマルチスレッド プログラミングが初めてで、この問題について見つけたドキュメントに混乱しています。

次のコードがあるとしましょう。

public class Test {
public ArrayList<Integer> items = new ArrayList<Integer>();

public Test(ArrayList<Integer> items) {
    this.items = items; 
}

public void perform() {
    synchronized(items) {
        int size = items.size();
        for(int n = 0; n < 10000; n++) {
              for(int i = 0; i < size; i ++) {
                  items.set(i, items.get(i) + 1);
              }
        }
    }
}

"perform" の内部ループが実行されている間、ループ全体が "synchronized(items)" ステートメントに含まれているにもかかわらず、"items" が別のスレッドで変更される可能性はありますか? それとも、「同期」ステートメントは、「同期 (アイテム)」自体を使用して「アイテム」のロックを要求する他のブロックによる変更からのみ保護しますか?

助けてくれてありがとう。

4

3 に答える 3

3

オブジェクトの同期は、他のスレッドがそのオブジェクトを変更できないという意味ではありません。これは、そのオブジェクトで同期する他のスレッドが、ロックが解放されるまで待機する必要があることを意味します。

それとも、「同期」ステートメントは、「同期 (アイテム)」自体を使用して「アイテム」のロックを要求する他のブロックによる変更からのみ保護しますか?」

したがって、このステートメントは正しいです。

于 2013-06-12T17:57:18.843 に答える
0

同期されたステートメントは、いくつかの「スレッドセーフではない」コード(または「クリティカルエリア」)を実行し、同期されたステートメント(つまり、スレッドセーフではないコード)を実行しようとする他のスレッドを完了するまでブロックします。

ただし、クリティカル領域を実行しない他のスレッドはブロックされません。

また、同期ステートメントは「ミューテックス」を使用します。ミューテックスは、クリティカルエリアが変更するオブジェクトを言います。(同期宣言のどれか)

あなたの場合は、

items

.

別のミューテックスを使用する (「アイテム」を使用しない) 他のスレッドもブロックされません。

以下が役立つかもしれません: http://en.wikipedia.org/wiki/Mutual_exclusion http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

于 2013-06-12T18:16:40.190 に答える