является потокобезопасным буферизованным считывателем?

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

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 остаются прежними. Почему?


person user882196    schedule 01.12.2011    source источник
comment
Немного пробежался по деталям, но не могли бы вы просто создать потокобезопасный класс-оболочку?   -  person mre    schedule 01.12.2011
comment
Я думаю, что хэш-код для BufferedReader может быть идентичен, если идентичен InputStream. Также не могли бы вы попытаться объяснить ситуацию немного лучше? Трудно сформулировать адекватный ответ.   -  person TFennis    schedule 01.12.2011
comment
Являются ли reader и т. д. статическими или это локальные переменные? Как вы создаете этот вывод? Хэш-код должен меняться для каждого нового объекта, и AFAIK с помощью конструктора не может создать уже существующий объект (если только это не произошло в каком-то собственном коде, но я сомневаюсь, что это относится к BufferedReader и т. д.).   -  person Thomas    schedule 01.12.2011
comment
Кажется, здесь есть два вопроса... Какое отношение имеют друг к другу хеш-код и безопасность потоков?   -  person Jonathan    schedule 01.12.2011
comment
Если это локальная переменная, не могли бы вы опубликовать код, который вызывает этот метод, а также код, который создает опубликованный вами вывод?   -  person Thomas    schedule 01.12.2011
comment
Можете ли вы опубликовать свой фактический код, так как он не компилируется?   -  person Peter Lawrey    schedule 01.12.2011
comment
readLine из BufferedReader должен быть потокобезопасным (из текущего источника). Не могли бы вы показать некоторый код, а также описать, почему вы хотите, чтобы несколько потоков использовали один и тот же BufferedReader?   -  person Roger Lindsjö    schedule 01.12.2011


Ответы (1)


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

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

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

Тем не менее, есть еще две вещи, которые следует учитывать:

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

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

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

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

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

person Stephen C    schedule 01.12.2011
comment
Могу только предположить, что ваше предположение/утверждение о том, что вы каждый раз создаете новые экземпляры, на самом деле неверно. ? Как это неправильно, когда я каждый раз создаю новый экземпляр. - person user882196; 01.12.2011
comment
каждый раз создается новый Resource, однако базовый BufferedReader явно является одним и тем же экземпляром. - person jtahlborn; 01.12.2011
comment
@ user882196 - Я говорю, что равенство хэш-кодов означает, что вы НЕ создаете экземпляр каждый раз. - person Stephen C; 01.12.2011
comment
да, это то, что я говорю ... почему это то же самое, когда я каждый раз делаю новый BufferedReader. - person user882196; 01.12.2011
comment
@ user882196 - И я говорю, что это то же самое, потому что ... что бы вы ни подумали ... вы НЕ делаете новый BufferedReader каждый раз. Фрагменты кода, которые вы вставили в вопрос, не подходят друг другу и не будут компилироваться. Кроме того, они показывают, что вы можете создавать новые объекты Resource без создания новых объектов потока/читателя. - person Stephen C; 01.12.2011
comment
@ user882196 - вы можете не верить мне и искать альтернативное объяснение. Но я не думаю, что вы найдете его. - person Stephen C; 01.12.2011