缓冲读写器线程安全吗?
有什么办法,我可以得到一个线程安全缓冲的读者。我得到了以下信息,当我跑这个代码#缓冲读写器线程安全吗?
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?
是
BufferedReader
线程安全吗?
的Javadoc没有说明的一个BufferedReader是线程安全的,但是当我看源代码我看到读取方法使用synchronize
和内部lock
对象。 (您可以在http://www.docjar.com/html/api/java/io/BufferedReader.java.html检查自己这一点)
所以答案是(可能)是的,尽管它可能依赖的Java的实现和版本,您正在使用。
然而,还有其他的两件事考虑到:
BufferedReader
一个为Reader
的包装,其通常用于其他类的包装。如果其他线程使用相同的“I/O堆栈”的部分,BufferedReader
线程安全的事实是不够的。如果你有两个线程都试图从相同的
BufferedReader
读取,你可能会因为线程不协调而陷入困境。虽然单独的读取操作是以原子方式运行的,但操作序列不会。
简而言之,线程安全并不一定足以确保在多线程应用程序中不会出现问题。
BufferedReader
,InputStreamReader
和InputStream
的哈希码保持不变。为什么?
3个新对象与以前创建的对象具有相同的标识的概率非常小,因此我只能假设您每次创建新实例的假设/断言实际上都是不正确的。
“我只能假设你每次创建新实例的假设/断言实际上都是不正确的。” ?当我每次创建一个新实例时,它是如何不正确的。 – user882196
每次都会创建一个新的'Resource',然而,底层的'BufferedReader'显然是同一个实例。 – jtahlborn
@ user882196 - 我在说hashcodes是equals意味着你不是每次都创建一个实例。 –
种类略过细节,但不能只是创建一个线程安全包装类? – mre
我认为如果InputStream是相同的,BufferedReader的哈希码可能是相同的。你也可以尝试解释一下情况好一点吗?很难制定出合适的答案。 – TFennis
'reader'等是静态还是局部变量?你如何创建输出?哈希码应该改变每个新的对象和AFAIK使用一个构造函数,没有办法可以创建一个已经存在的对象(除非在一些本地代码中发生这种情况,但是我怀疑'BufferedReader'等情况)。 – Thomas