有什么方法可以获得一个线程安全的缓冲读卡器。当我运行这段代码时,我得到了以下信息#
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的哈希码保持不变。为什么?
答案 0 :(得分:5)
BufferedReader
线程是否安全?
javadoc没有声明BufferedReader是线程安全的,但是当我查看源代码时,我看到read方法使用synchronize
和内部lock
对象。 (您可以在http://www.docjar.com/html/api/java/io/BufferedReader.java.html)
所以答案是(可能)是的,尽管可能依赖于您正在使用的Java的实现和版本。
但是,还有两件事需要考虑:
BufferedReader
是Reader
的包装器,通常是其他类的包装器。如果其他线程使用相同“I / O堆栈”的部分,BufferedReader
是线程安全的这一事实是不够的。
如果你有两个线程试图从同一个BufferedReader
读取,你可能会遇到麻烦,因为线程没有协调。虽然各个读取操作以原子方式运行,但操作序列却没有。
简而言之,线程安全不一定足以确保多线程应用程序不会出现问题。
BufferedReader
,InputStreamReader
和InputStream
的哈希码保持不变。为什么呢?
3个新对象具有与3个先前创建的对象相同的身份哈希码的概率非常小,因此我只能假设您每次创建新实例的假设/断言实际上是不正确的。