我正在試圖找到指示java.util.concurrent.Future是否爲線程安全的文檔。例如,我可以安全地將Future的同一實例分配給多個線程,這將會調用Future.get(...)?是java.util.concurrent.Future線程安全嗎?
我已經用這種方式測試了使用Future的代碼,它似乎工作正常,但是如果我能夠找到有證據的期望,以這種方式進行併發訪問將是安全的,我會更加高興。
謝謝。
我正在試圖找到指示java.util.concurrent.Future是否爲線程安全的文檔。例如,我可以安全地將Future的同一實例分配給多個線程,這將會調用Future.get(...)?是java.util.concurrent.Future線程安全嗎?
我已經用這種方式測試了使用Future的代碼,它似乎工作正常,但是如果我能夠找到有證據的期望,以這種方式進行併發訪問將是安全的,我會更加高興。
謝謝。
鑑於Future旨在被多個線程(至少提交,以及設置其結果的那個),並且鑑於文檔指定在異步計算和get調用之後發生的操作之間存在before-before關係,我會假設這些實現是線程安全的(至少是標準實現)。
如果您使用從ExecutorService
返回的Future
,那麼確定它們是線程安全的。由於Future是一個接口,接口的創建者不能保證所有的實現都是線程安全的。
尼澤確實提出了一個很好的觀點。該文檔說,未來接口的實現應該是線程安全的,而不是使實現線程安全,然後違反未來的合同
本質上,這個註釋與Nizet的答案相同:您可以在JDK javadoc中看到內存一致性保證:http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package- summary.html#package_description –
安全地閱讀「在另一個線程中通過Future.get()檢索結果之後的Future happen-before動作所代表的異步計算所採取的動作。」對於_many_其他線程以及其他線程都是如此? - 「另一個線程」的字面意思是指一個**單獨的**線程,而不是許多線程。 Ofc似乎可能是一個未來的實施者將不得不竭盡全力讓它爲許多人打破併爲一個人工作,所以我強烈懷疑這實際上是安全的。 – S42
是的,因爲每次調用Future.get()都會在「發生之前」保證之下。這是因爲每次調用都會編譯到同一個程序集,涉及到http://en.wikipedia.org/wiki/Memory_barrier –