2011-12-01 248 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意味着你不是每次都创建一个实例。 –