2017-01-17 5 views
2

Недавно я использовал класс Apache Commons-IO CountingInputStream. Он просто отслеживает, сколько байтов было прочитано обновлением поля счетчика.В чем преимущество синхронизации InputStream?

Я заметил, что он обновляет свой счетчик с помощью ключевого слова synchronized. Лучший источник, который я мог найти, - IO-201, но это не объясняет почему.

Я читал в нескольких местах, что код Apache Commons является хорошим качеством, но теперь мне интересно, почему у них есть синхронизированные методы в InputStream. Я не считаю, что безопасность потоков - полезное свойство потока, а также комментаторы IO-201.

Учитывая, что я не обращаюсь к InputStream одновременно, есть ли веская причина для синхронизации его методов? Или существует допустимый прецедент для одновременного доступа к InputStream, который не будет содержать мусор данных?

+0

Я не могу окунуться в мысли, что можно одновременно считывать InputStream, не получая мусор данных. Поэтому я предполагаю, что параллелизм не может быть мотивацией для этого «синхронизированного». Но, возможно, это просто мое ограниченное воображение. Я не беспокоюсь, я просто хочу понять мотивацию, чтобы узнать что-то из этого. –

+0

Хорошо, я вижу. Другой поток может вызвать 'getCount()'. Без каких-либо действий синхронизации модель памяти запускается, а другой поток никогда не сможет увидеть обновление. Хорошо, я доволен. Летучие, а не синхронизированные, вероятно, тоже будут выполнять ту же работу, верно? –

+0

Нет, добавление переменной 'volatile' не является потокобезопасным. –

ответ

3

Учитывая, что я не обращаюсь к InputStream одновременно, есть ли веские причины для синхронизации его методов?

Нет, у вас нет веских причин использовать синхронизированные методы для объектов, к которым вы обращаетесь только из одного потока. При этом вы используете сторонний код, который делает синхронизировать для защиты изменяемого состояния (поле count), поэтому у вас нет большого выбора, кроме его реализации.

Или существует ли действующий прецедент для доступа к InputStream одновременно, который не будет производить сбор данных?

InputStream? Возможно нет. A CountingInputStream? Конечно ... в одном потоке я неоднократно вызываю CountingInputStream.read(), чтобы потреблять поток, а в другом потоке я неоднократно вызываю CountingInputStream.getCount(), чтобы обновить свой интерфейс, чтобы показать количество строк, которые я прочитал.

Смежные вопросы