2011-12-01 293 views
2

有什麼辦法,我可以得到一個線程安全緩衝的讀者。我得到了以下信息,當我跑這個代碼#緩衝讀寫器線程安全嗎?

Threadid=28 [email protected] 
Threadid=28 [email protected] 
Threadid=28 [email protected] 
Threadid=28 [email protected] 
28 started Reading 
Threadid=28 [email protected] 
Threadid=28 [email protected] 
Threadid=28 [email protected] 
Threadid=28 [email protected] 
28 finished Reading 
Threadid=38 [email protected] 
Threadid=38 [email protected] 
Threadid=38 [email protected] 
Threadid=38 [email protected] 
38 started Reading 
Threadid=38 [email protected] 
Threadid=38 [email protected] 
Threadid=38 [email protected] 
Threadid=38 [email protected] 
38 finished Reading 

的緩衝讀者的哈希碼,InputStreamReader和InputStream中仍然same.Why?

+1

種類略過細節,但不能只是創建一個線程安全包裝類? – mre

+0

我認爲如果InputStream是相同的,BufferedReader的哈希碼可能是相同的。你也可以嘗試解釋一下情況好一點嗎?很難制定出合適的答案。 – TFennis

+0

'reader'等是靜態還是局部變量?你如何創建輸出?哈希碼應該改變每個新的對象和AFAIK使用一個構造函數,沒有辦法可以創建一個已經存在的對象(除非在一些本地代碼中發生這種情況,但是我懷疑'BufferedReader'等情況)。 – Thomas

回答

5

BufferedReader線程安全嗎?

的Javadoc沒有說明的一個BufferedReader是線程安全的,但是當我看源代碼我看到讀取方法使用synchronize和內部lock對象。 (您可以在http://www.docjar.com/html/api/java/io/BufferedReader.java.html檢查自己這一點)

所以答案是(可能)是的,儘管它可能依賴的Java的實現和版本,您正在使用。

然而,還有其他的兩件事考慮到:

  • BufferedReader一個爲Reader的包裝,其通常用於其他類的包裝。如果其他線程使用相同的「I/O堆棧」的部分,BufferedReader線程安全的事實是不夠的。

  • 如果你有兩個線程都試圖從相同的BufferedReader讀取,你可能會因爲線程不協調而陷入困境。雖然單獨的讀取操作是以原子方式運行的,但操作序列不會。

簡而言之,線程安全並不一定足以確保在多線程應用程序中不會出現問題。

BufferedReader,InputStreamReaderInputStream的哈希碼保持不變。爲什麼?

3個新對象與以前創建的對象具有相同的標識的概率非常小,因此我只能假設您每次創建新實例的假設/斷言實際上都是不正確的。

+0

「我只能假設你每次創建新實例的假設/斷言實際上都是不正確的。」 ?當我每次創建一個新實例時,它是如何不正確的。 – user882196

+0

每次都會創建一個新的'Resource',然而,底層的'BufferedReader'顯然是同一個實例。 – jtahlborn

+0

@ user882196 - 我在說hashcodes是equals意味着你不是每次都創建一個實例。 –