С меткой() и сброса() методы не имеют никакого кода внутри них, слово «синхронизируется» является только «напоминание» для реализации классов, которые они должны поставить замки или в этих методах, когда они переопределяют их , Это делается для предотвращения условий гонки в многопоточных прецедентах.
Теперь другие методы InputStream не отмечены как «синхронизированные», потому что эти методы никогда не будут генерировать IndexOutOfBoundsException, BufferOverflowException и т. Д. (за исключением случаев, когда вы проходите в плохих размерах буфера). Эти методы всегда возвращают -1, когда больше нет байтов для чтения, а не выбрасывается исключение. Поэтому их не нужно синхронизировать.
Вы заметите, что read() является абстрактным. И реализующие классы задают «синхронизированный», когда они реализуют этот метод.
Другими словами, абстрактный класс InputStream может обрабатывать многопотоки, а также классы реализации.
Существует нет практической причины для их синхронизации, возможно, это всего лишь подсказка для авторов подкласса InputStream. Кроме того, очень сложно представить реалистичный сценарий, когда обмен потоком между двумя или более потоками будет полезен вообще. (На самом деле трудно представить себе сценарий, где это не приведет к катастрофе.) – biziclop
@biziclop, я придерживаюсь того же мнения. Это похоже на ошибку или рудимент. Я просто хочу услышать другие мнения. Благодаря! – Antonio
Ух, теперь я посмотрел исходный код ... Ненужная синхронизация не так плоха, как тот факт, что базовая реализация 'read (byte [], int, int)' swallows 'IOException's ... – Holger