2014-03-03 42 views
0

基於java.NIO的文檔,緩衝區是線程不安全的,而大多數情況下的通道(FileChannel, SocketChannel等)可安全地用於多線程。我在文檔中找不到的是對例如在兩個線程同時開始從FileChannel讀取。第一個操作是首先讀取N個字節,還是有可能將第一個M字節傳送到第一個通道的緩衝區,然後下一個傳送到第二個緩衝區,然後再進行上下文切換,再讀入第一個緩衝區。任何人都知道多線程訪問渠道的保證是什麼?java NIO - 對通道的多線程訪問

回答

1

讀取「涉及文件的位置」,因此阻止其他線程的後續讀取。然而,沒有什麼能夠保證讀取返回的單字節或多線程的字節數,除了如果有剩餘的字節需要讀取,它大於零。

+0

所以有可能,有一個'Hello World'文件內容和3個併發讀者來取回'HeWo'''''''rld'或者其他類似的混合? – Bober02

+0

@ Bober02我無法找到任何暗示線程不會讀取重複數據的任何內容 - 即它們可能都會返回「Hello World」或來自此字符串的任何字符組合...... –

+0

這是不正確的。他們都推進了原子處理的文件指針,所以它們都會讀取文件的不同部分。 – EJP