2011-11-06 3 views
2

Кажется, что ничего не может найти о «блокировке» входного потока, который описывает и то, что он есть, и когда это происходит. Является ли это некоторым типом многопоточной защиты одновременных потоков, обращающихся к одному и тому же потоку?«поток» потока ввода-вывода Java и многопоточность

В этой заметке, когда два одновременных потока одновременно обращаются к одному и тому же потоку, могут ли это вызвать проблемы или оба потока получают свои собственные указатели потока? Очевидно, что нужно подождать, но, надеюсь, это не приведет к необъявленному исключению.

ответ

2

В контексте входных потоков «блокировка» обычно относится к потоку, ожидающему появления большего количества данных. Этот термин, вероятно, будет иметь больше смысла, если вы подумаете о сокетах, а не о файлах.

Если у вас есть несколько потоков, одновременно просматривающих из одного потока, вы должны выполнить свою собственную синхронизацию. Нет указателей потока, специфичных для потока. Опять же, подумайте о нескольких чтениях из одного и того же сокета (а не из файла).

+0

Итак, если поток 1 начал читать данные с начала потока, а затем (потом) поток 2 начал читать из того же потока, будет ли поток 2 читать с самого начала или где поток 1 прекратился? –

+0

@ user1030796: Последний (где нить 1 прекращена). – NPE

+1

@aix, поскольку потоки не обязательно являются потокобезопасными, ответ: «вы не можете сказать точно» :) Я имею в виду, что вы правы, если читать в потоке 1 * происходит-до * читать в потоке 2. – alf

1

Каждый поток имеет указатель потока. Не имеет смысла иметь два потока, читающих один и тот же поток.

+0

I посмотри, что ты говоришь. Я думаю, что, возможно, неправильно это назвал, или, может быть, придумал все в моей голове. Иногда я путаю даже себя. –

4

«Блокировка» происходит, когда чтение или запись зависает, ожидая либо большей информации (для чтения), либо для большего количества места в некотором внутреннем буфере (для записи), прежде чем возвращать управление вызывающему потоку.

И я уверен, что объект потока заботится о своих собственных местах чтения/записи, поэтому указатель просто указывает на объект потока, который считывает из собственного буфера. Итак, если вы читаете с помощью синхронизированных методов, то каждое чтение будет ждать своей очереди и получать сплоченные (но не перекрывающиеся) данные. Если методы не синхронизированы, то я уверен, что весь ад сломается.

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