缓冲读卡器线程安全吗?

时间:2011-12-01 13:31:07

标签: java multithreading bufferedreader

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

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的哈希码保持不变。为什么?

1 个答案:

答案 0 :(得分:5)

  

BufferedReader线程是否安全?

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

自行查看

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

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

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

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

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

  

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

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