Является ли буферизованный считыватель безопасным? - PullRequest
2 голосов
/ 01 декабря 2011

Есть ли способ получить поточно-буферизованный читатель. Я получил следующую информацию, когда запустил этот код #

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 Ответ

5 голосов
/ 01 декабря 2011

Является ли BufferedReader потокобезопасным?

Javadoc не утверждает, что BufferedReader является поточно-ориентированным, но когда я смотрю на исходный код, я вижу, что методы чтения используют synchronize и внутренний lock объект. (Вы можете проверить это сами на http://www.docjar.com/html/api/java/io/BufferedReader.java.html)

Таким образом, ответ (вероятно) да, хотя может зависеть от используемой вами реализации и версии Java.

Однако есть еще две вещи, которые необходимо учитывать:

  • A BufferedReader - это оболочка для Reader, которая обычно является оболочкой для других классов. Если части одного и того же «стека ввода-вывода» используются другими потоками, того факта, что BufferedReader является потокобезопасным, недостаточно.

  • Если у вас есть два потока, которые пытаются прочитать с одного и того же BufferedReader, вы можете столкнуться с проблемами из-за того, что потоки не координируются. В то время как отдельные операции чтения ведут себя атомарно, последовательности операций - нет.

Короче говоря, потокобезопасность не обязательно достаточна, чтобы не было проблем в многопоточном приложении.

Хеш-коды для BufferedReader, InputStreamReader и InputStream остаются неизменными. Почему?

Вероятность того, что 3 новых объекта будут иметь такие же хэш-коды идентичности, что и 3 ранее созданных объекта, очень мала, поэтому я могу только предположить, что ваше предположение / утверждение, что вы создаете новые экземпляры каждый раз, на самом деле неверно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...