2011-12-05 4 views
11

私はjava.util.concurrent.Futureがあるかどうかを示す文書を見つけようとしていますが/スレッドセーフではありません。たとえば、私はFutureの同じインスタンスに複数のスレッドを安全に与えることができます。これはすべてFuture.get(...)を呼び出しますか?java.util.concurrent.Future threadsafeですか?

私は、このように将来を使用してコードをテストしているし、正常に動作するようですが、私は将来はこのように同時アクセスのために安全であることを文書化期待を見つけることができれば、私は非常に幸せになると思います。

ありがとうございました。

+2

このコメントは、Nizetの答えと同じです。JDK javadocでメモリーの一貫性を保証することができます。http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package- summary.htmlに番号をpackage_description –

+0

ですそれ安全な「未来に代表される非同期計算で撮影したアクションが起こる前に、別のスレッドでFuture.getを経由して、結果の検索に後続のアクション()。」読むために_many_他のスレッドだけでなく、他のスレッドも真です - 「別のスレッド」とは、文字通り、複数のスレッドとは対照的に、単一の**他のスレッドを示します。 Ofcでは、将来の実装者が、多くの人に壊れて1人で働くために道を離れなければならない可能性が高いので、現実には安全だと強く思っています。 – S42

+1

はい、 'Future.get()'を呼び出すたびに "happen-before"保証が適用されるためです。各呼び出しは、1つまたはすべてのスレッドは、getの結果を待っているブロックしますhttp://en.wikipedia.org/wiki/Memory_barrier –

答えて

9

未来が複数のスレッド(少なくとも、その結果を設定するもの)と、ドキュメンテーションが非同期計算とget呼び出しの後に起こるアクションとの間に事象と前の関係があることを指定していれば、実装はスレッドセーフです(少なくとも標準実装)。

+1

私は強くそれが起こる-前に2つのスレッド間で作業するためのスレッドの安全性は、一般的にも、私が解釈できる場合しかし、私は上の明確な100%ではないです、Nスレッドの罰金になることを考えれば、ほぼ確実に実際に安全であることを同意に傾いています保証の文言が他の単一のスレッドを示唆するとき、多くのスレッドに対して保証されたものとして起こる。そのマイナーな予約にもかかわらず、私はあなたのコメントを投票しています。これは、利用可能な最良の答えと思われるからです。 – S42

+1

@ S42あなたは言葉をあまりにも文字通り読んでいます。 Javaでは、一対のスレッド間に特別な通信は全くありません。すべてのスレッドはメモリを同期させて通信し、すべてのスレッドで同じように使用できます。 – toto2

4

ExecutorServiceから返されたFutureを使用している場合は、スレッドセーフであることが保証されています。 Futureはインタフェースなので、インタフェースの作成者はすべての実装がスレッドセーフであることを保証することはできません。

Nizetはしかし良い点を持ち出すん。将来のインタフェースの実装はスレッドセーフでなければならず、実装をスレッドセーフにしないとFutureの契約に違反することになります。

関連する問題