2011-12-05 182 views
11

我正在試圖找到指示java.util.concurrent.Future是否爲線程安全的文檔。例如,我可以安全地將Future的同一實例分配給多個線程,這將會調用Future.get(...)?是java.util.concurrent.Future線程安全嗎?

我已經用這種方式測試了使用Future的代碼,它似乎工作正常,但是如果我能夠找到有證據的期望,以這種方式進行併發訪問將是安全的,我會更加高興。

謝謝。

+2

本質上,這個註釋與Nizet的答案相同:您可以在JDK javadoc中看到內存一致性保證:http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package- summary.html#package_description –

+0

安全地閱讀「在另一個線程中通過Future.get()檢索結果之後的Future happen-before動作所代表的異步計算所採取的動作。」對於_many_其他線程以及其他線程都是如此? - 「另一個線程」的字面意思是指一個**單獨的**線程,而不是許多線程。 Ofc似乎可能是一個未來的實施者將不得不竭盡全力讓它爲許多人打破併爲一個人工作,所以我強烈懷疑這實際上是安全的。 – S42

+1

是的,因爲每次調用Future.get()都會在「發生之前」保證之下。這是因爲每次調用都會編譯到同一個程序集,涉及到http://en.wikipedia.org/wiki/Memory_barrier –

回答

9

鑑於Future旨在被多個線程(至少提交,以及設置其結果的那個),並且鑑於文檔指定在異步計算和get調用之後發生的操作之間存在before-before關係,我會假設這些實現是線程安全的(至少是標準實現)。

+1

我強烈地傾向於同意,現實中幾乎可以肯定是安全的,因爲線程安全的發生 - 在2個線程之間工作之前,對於N個線程來說,通常也是可以的,但是如果我能解釋的話,我並不是100%清楚的在保證的措辭提示單個其他線程時,在多線程保證之前發生。儘管我提出了小的保留意見,但我現在正在對您的意見進行投票,因爲它似乎可能是最佳答案。 – S42

+1

@ S42你正在逐字閱讀措辭。在Java中,一對線程之間絕對沒有特殊的通信;所有線程都通過同步內存進行通信,並且它對所有線程均可用。 – toto2

4

如果您使用從ExecutorService返回的Future,那麼確定它們是線程安全的。由於Future是一個接口,接口的創建者不能保證所有的實現都是線程安全的。

尼澤確實提出了一個很好的觀點。該文檔說,未來接口的實現應該是線程安全的,而不是使實現線程安全,然後違反未來的合同