クラスのすべてのメソッドを個別に同期させても、それらのメソッドのスレッドセーフである集約(グループ内での呼び出し)は行われません。 Iterator
を同期ブロックにラップすると、イテレータの特定のインスタンスが、複数のスレッドによる他の呼び出しと散在した個別のメソッドを持つのを防ぎます。
それが安全になると私は.add()
を呼び出す場合、私は論理的な文を完了するために、.add()
を複数回呼び出す必要があれば、他の誰かが私でない限り、私の.add()
呼び出しの間に何かを何か他のものを追加または削除していないという保証はありません他のすべてをブロックし、.add()
(または他の方法)をsynchronizing
で、コレクションを表す変数に呼び出します。
Iterator
は、コレクション上の個々のメソッドを複数回呼び出すため、すべてブロックにラップして、1つのtransaction
のソートとして実行する必要があります。 Iterator
の実装のソースコードを調べると、私の言いたいことが分かります。 List
のソースコードは、基になる実装への複数の個別の呼び出しを行うため、同じスレッドによって途切れない順序で実行され、確定的に実行される必要があります。 AbstractList.iterator()
ため
@Override
public Iterator<A> iterator() {
if (tail == null)
return emptyIterator();
return new Iterator<A>() {
List<A> elems = List.this;
public boolean hasNext() {
return elems.tail != null;
}
public A next() {
if (elems.tail == null)
throw new NoSuchElementException();
A result = elems.head;
elems = elems.tail;
return result;
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
source複数の呼び出しを行い、さらに複雑なロジックを示しています。
より包括的なラッパーがコレクションの中にラップしている場合は、コール間で基礎となるコレクションを変更できないことを保証します。
「必ずしも複数の別個のメソッド呼び出しを必要とする」とはどういう意味ですか? – user697911
@ user697911: 'i.hasNext()'と 'i.next()'は別々の2つのメソッド呼び出しであり、 'Collections.synchronizedCollection'の実装では、' i.hasNext () 'と' i.next() 'のようになります。 –
したがって、concurrentHashmapは同じですか?また、反復で同時にハッシュ関数を同期させる必要がありますか? – user697911