Java NIO - многопоточный доступ к каналам
Основываясь на документации java.NIO, буферы являются поточно-небезопасными, тогда как каналы в большинстве случаев (FileChannel, SocketChannel
и т. д.) безопасны для использования несколькими потоками. Что я не могу найти в документации, так это четкое описание того, что происходит, например, когда два потока начинают читать с FileChannel
одновременно. Читает ли первая операция первые N байтов или возможно получить первые M байтов в буфер первого канала, а затем следующая пара перейдет во второй буфер, прежде чем переключение контекста прочитает еще немного в первый и т. Д. Кто-нибудь знает, каковы гарантии многопоточного доступа к каналам?
1 ответ
Чтение "включает в себя позицию файла" и, следовательно, блокирует последующие чтения другими потоками. Однако ничто не гарантирует, сколько байтов вернет чтение, одно- или многопоточное, за исключением того, что оно больше нуля, если осталось байтов для чтения.