2014-03-03 4 views
0

java.nio의 설명서에 따르면 버퍼는 스레드 안전하지 않지만 대부분의 경우 채널 (FileChannel, SocketChannel 등)은 여러 스레드에서 사용하는 것이 안전합니다. 설명서에서 찾을 수없는 내용은 예를 들어 다음과 같은 경우에 발생하는 상황에 대한 명확한 설명입니다. 두 스레드는 FileChannel에서 동시에 읽기를 시작합니다. 첫 번째 작업은 처음 N 바이트를 읽거나 첫 번째 M 바이트를 첫 번째 채널의 버퍼로 가져올 수 있고 다음 커플은 두 번째 버퍼로 갈 것입니다. 누구나 채널에 대한 다중 스레드 액세스에 대한 보증을 알고 있습니까?java NIO - 채널에 대한 다중 스레드 액세스

답변

1

읽기는 "파일의 위치를 ​​포함"하므로 다른 스레드가 다음에 읽는 것을 차단합니다. 그러나 아무것도 읽을 수있는 바이트가 있으면 0보다 큰 것을 제외하고는 단일 또는 다중 스레드 여부에 상관없이 읽기가 반환하는 바이트 수를 보장하지 않습니다.

+0

그래서'Hello World'의 파일 내용과 3 명의 동시 독자가'Helo''ll''lld' 또는 이것과 비슷한 다른 혼합을 되 찾을 수 있습니까? – Bober02

+0

@ Bober02 스레드가 복제 된 데이터를 읽지 못하도록 제안 할만한 것을 찾지 못했습니다. 즉, 모두 "Hello World"또는이 문자열의 문자 조합을 반환 할 수 있습니다. –

+0

맞지 않습니다. 파일 포인터는 모두 원자 포인터로 처리되므로 원자 포인터로 처리되므로 파일의 고유 한 부분을 모두 읽습니다. – EJP