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