2

これらの同期方法の違いは何だろうと思っています

List<Integer> intList = Collections.synchronizedList(new ArrayList<Integer>());

synchronized (intList) {
    //Stuff
}

オブジェクトロックの使用

Object objectLock = new Object();

List<Integer> intList = new ArrayList<Integer>();

synchronized (objectLock) {
    //Stuff
}
4

2 に答える 2

6

最初のアプローチでは、個々のメソッド呼び出しが確実に同期され、個別のロック オブジェクトを管理する必要がなくなります。1 つのスレッドで呼び出すことができます

intList.add(3);

そして別の人が呼び出すことができます

intList.clear();

ブロックなしで、synchronized適​​切に同期されます。(残念ながら、関数呼び出しのグループに対してロックを保持する必要がある場合、これは役に立ちません。その場合、synchronizedそれらの呼び出しの周りにブロックが必要です。) また、リストを渡す必要がある場合は、次を使用できます。

otherObject.doStuffWith(intList);

return intList;

それ以外の

otherObject.doStuffWith(intList, objectLock);

return ListAndLock(intList, objectLock);
于 2013-08-20T00:32:18.080 に答える
0

あなたが示すコードは必ずしもスレッドセーフではありません!!

1 つの抜粋と他の抜粋の唯一の違いは、同期のモニターとして使用するオブジェクトです。この違いにより、保護しようとしている変更可能なデータにアクセスする必要がある他のスレッドが同期に使用するオブジェクトが決まります。

これについての素晴らしい読み物:実際の Java 並行性

于 2013-08-20T00:38:33.960 に答える