是缓冲读卡器线程安全吗?

有什么办法我可以得到一个线程安全的缓冲读卡器。当我运行此代码时,我得到了以下信息#

Threadid=28 ObjectReference=de.factfinder.resource.Resource@1b7aeb4 Threadid=28 ObjectReference=java.io.InputStream@3d6fb9 Threadid=28 ObjectReference=java.io.InputStreamReader@171e0f6 Threadid=28 ObjectReference=java.io.BufferedReader@1684179 28 started Reading Threadid=28 ObjectReference=de.factfinder.resource.Resource@1b7aeb4 Threadid=28 ObjectReference=java.io.InputStream@3d6fb9 Threadid=28 ObjectReference=java.io.InputStreamReader@171e0f6 Threadid=28 ObjectReference=java.io.BufferedReader@1684179 28 finished Reading Threadid=38 ObjectReference=de.factfinder.resource.Resource@1bebf14 Threadid=38 ObjectReference=java.io.InputStream@3d6fb9 Threadid=38 ObjectReference=java.io.InputStreamReader@171e0f6 Threadid=38 ObjectReference=java.io.BufferedReader@1684179 38 started Reading Threadid=38 ObjectReference=de.factfinder.resource.Resource@1bebf14 Threadid=38 ObjectReference=java.io.InputStream@3d6fb9 Threadid=38 ObjectReference=java.io.InputStreamReader@171e0f6 Threadid=38 ObjectReference=java.io.BufferedReader@1684179 38 finished Reading 

缓冲读取器,InputStreamReader和InputStream的哈希码保持不变。为什么?

BufferedReader线程安全吗?

javadoc没有声明BufferedReader是线程安全的,但是当我查看源代码时,我看到read方法使用了synchronize和一个内部lock对象。 (您可以在http://www.docjar.com/html/api/java/io/BufferedReader.java.html上自行查看 )

所以答案是(可能)是,尽管它可能取决于您正在使用的Java的实现和版本。

但是,还有两件事需要考虑:

  • BufferedReaderReader的包装Reader ,它通常是其他类的包装器。 如果其他线程使用相同“I / O堆栈”的部分,则BufferedReader是线程安全的这一事实是不够的。

  • 如果你有两个线程试图从同一个BufferedReader读取,你可能会遇到麻烦,因为线程没有协调。 虽然各个读操作以primefaces方式运行,但操作序列却没有。

简而言之,线程安全性不一定足以确保multithreading应用程序中不会出现问题。

BufferedReaderInputStreamReaderInputStream的哈希码保持不变。 为什么?

3个新对象具有与3个先前创建的对象相同的身份哈希码的概率非常小,因此我只能假设您每次创建新实例的假设/断言实际上是不正确的。