Java 缓冲读取器线程安全吗?

Java 缓冲读取器线程安全吗?,java,multithreading,bufferedreader,Java,Multithreading,Bufferedreader,有什么方法可以得到线程安全的缓冲读取器吗# 缓冲读取器、InputStreamReader和InputStream的哈希代码保持不变。为什么 BufferedReader线程安全吗 javadoc没有声明BufferedReader是线程安全的,但是当我查看源代码时,我看到读取方法使用synchronize和内部lock对象。(您可以在上亲自检查) 所以答案(可能)是肯定的,尽管这可能取决于您使用的Java的实现和版本 但是,还有两件事需要考虑: BufferedReader是读取器的包装器,

有什么方法可以得到线程安全的缓冲读取器吗#

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

BufferedReader
线程安全吗

javadoc没有声明BufferedReader是线程安全的,但是当我查看源代码时,我看到读取方法使用
synchronize
和内部
lock
对象。(您可以在上亲自检查)

所以答案(可能)是肯定的,尽管这可能取决于您使用的Java的实现和版本

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

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

  • 如果有两个线程都试图从同一个
    BufferedReader
    读取数据,则可能会由于线程不协调而陷入麻烦。虽然单个读取操作的行为是原子性的,但操作序列却不是原子性的

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

BufferedReader
InputStreamReader
InputStream
的哈希代码保持不变。为什么?


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

略过了一些细节,但是你不能创建一个线程安全的包装类吗?我认为如果InputStream是相同的,那么BufferedReader的hashcode可能是相同的。你能不能把情况解释清楚一点?很难给出一个合适的答案。
reader
等是静态的还是那些局部变量?如何创建该输出?哈希代码应该为每个新对象更改,如果使用构造函数,则无法创建已经存在的对象(除非在某些本机代码中发生这种情况,但我怀疑
BufferedReader
等)这里似乎有两个问题。。。散列代码和线程安全性之间有什么关系?如果这是一个局部变量,您可以发布调用此方法的代码以及生成您发布的输出的代码吗?“我只能假设您每次创建新实例的假设/断言事实上是不正确的。”?每次创建一个新实例时,它是多么不正确。但是,每次都会创建一个新的
资源,底层的
BufferedReader
显然是同一个实例。@user882196-我是说hashcodes相等意味着你不是每次都创建一个实例。是的,这就是我所说的。。为什么每次我都在做新的BufferedReader时都是一样的。@user882196-你可以不相信我并寻找替代方案解释。但我想你找不到。
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