【问题标题】:is buffered reader thread safe?缓冲阅读器线程安全吗?
【发布时间】:2011-12-01 13:31:06
【问题描述】:

有什么方法可以获得线程安全的缓冲阅读器。我在运行此代码时得到了以下信息#

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

buffered reader 、 InputStreamReader 和 InputStream 的哈希码保持不变。为什么?

【问题讨论】:

  • 有点略过细节,但你不能只创建一个线程安全的包装类吗?
  • 如果 InputStream 相同,我认为 BufferedReader 的哈希码可能相同。你也可以试着更好地解释一下情况吗?很难给出一个合适的答案。
  • reader 等是静态的还是那些局部变量?您如何创建该输出?哈希码应该为每个新对象和使用构造函数的 AFAIK 更改,不可能创建已经存在的对象(除非在某些本机代码中发生,但我怀疑 BufferedReader 等的情况)。
  • 这里似乎有两个问题...哈希码和线程安全之间有什么关系?
  • 如果这是一个局部变量,您能否发布调用此方法的代码以及生成您发布的输出的代码?

标签: java multithreading bufferedreader


【解决方案1】:

BufferedReader 线程安全吗?

javadoc 没有说明 BufferedReader 是线程安全的,但是当我查看源代码时,我发现读取方法使用 synchronize 和内部 lock 对象。 (您可以通过http://www.docjar.com/html/api/java/io/BufferedReader.java.html自己查看)

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

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

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

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

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

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

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

【讨论】:

  • “我只能假设您每次都在创建新实例的假设/断言实际上是不正确的。” ?当我每次都创建一个新实例时它是如何不正确的。
  • 每次都会创建一个新的Resource,但是底层的BufferedReader 显然是同一个实例。
  • @user882196 - 我是说哈希码相等意味着你不是每次都创建一个实例。
  • 是的,这就是我的意思。为什么我每次都在做新的 BufferedReader 时都是一样的。
  • @user882196 - 你可以不相信我并寻找其他解释。但我不认为你会找到一个。
猜你喜欢
  • 2010-09-13
  • 2023-03-28
  • 2016-12-26
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多