14

GuavaのImmutableList.Builderのスレッドセーフ保証は何ですか? javadocs は言いません。

4

3 に答える 3

33

Guava Immutable クラスはスレッドセーフですが、ビルダーはそうではありません。ほとんどのアプリケーションでは、特定の Builder インスタンスとやり取りするスレッドは 1 つだけです。

通常、スレッド セーフが存在しないことを文書化する必要はありませんが、そのような Javadoc は不変コレクション ビルダーにとって意味がある場合があります。ImmutableList はスレッドセーフであるのに、ImmutableList.Builder はスレッドセーフではないことに驚かれるかもしれません。

于 2010-05-22T05:14:53.100 に答える
14

スレッド セーフが Javadoc に記載されていない場合でも、それを想定しないでください。

もっと真剣に、「いいえ」。

また、ImmutableList の javadoc とその友人には、「明らか」が常に当てはまるとは限らないため、そのような「かなり明白な、はい」というコメントが含まれていることをお勧めします (そのため、自分でそれを想定する必要はありません)。ちょうど先日scala.List、不変リストと、スレッド間で不適切に (データ競合を介して) 交換された場合に発生する可能性のあるいくつかの驚くべき問題について話し合っていました。さらに、それらは「不変==スレッドセーフ」と同等であるため、「明らかな」スレッドセーフの側面を文書化する場合でも、安全側にいることは報われます。

于 2010-05-20T09:57:07.587 に答える
2

@Dimitris Andreouに同意します。そのように文書化されていない場合は、スレッドセーフを想定しないでください。自明でないクラスをスレッドセーフにしようとするときは、ユーザーにそれを知ってもらいたいものです。

それを超えて、ビルダーの最も一般的なユースケースはスレッドに限定されると思います。つまり、何らかのメソッドのローカル変数としてです。リストを構築するために複数のスレッドが必要な場合、本当に不変ですか?

複数のスレッドがリストにフィードしているが、ある時点でスナップショットを作成し、「これ以上変更はありません。不変です」と言う場合は、それらのスレッドから要素を取得し、コンテンツを新しいものに凍結する何かを書きます。準備ができていることがわかっている場合は ImmutableList 。

于 2011-01-26T16:46:00.077 に答える