6979009: (fc) FileChannel.read() fails to throw ClosedByInterruptException

Alan Bateman Alan.Bateman at oracle.com
Sun Nov 7 11:58:09 PST 2010

Rémi Forax wrote:
> :
> There is another bug, closeLock is not final in 
> AbstractInterruptibleChannel.
Thanks, I hadn't noticed that. I will fix that while I'm in the area.

> :
> can be changed to:
> Thread current = Thread.currentThread();
> if (current.isInterrupted())
>     interruptor.interrupt(current);
> to avoid to call Threa.currentThread twice.
That is probably better.

> About the patch, I'm not sure to fully understand it.
The problem with the original implementation (this code is essentially 
unchanged since 1.4) is that closing the channel may cause several 
threads doing I/O on the same channel to observe the interrupted flag as 
false and so will throw ClosedByInterruptException. Alternatively, if 
some thread is just completing an I/O operation on the channel then it's 
invocation of the "end" method will reset the flag. The changes just 
mean that the intended thread will close the exception, other threads 
doing I/O on the channel at round the same time will close 
AsynchronousCloseException or have their I/O operations complete 
successfully. If several threads doing I/O on the channel are 
interrupted at around the same time then only one will throw 


More information about the nio-dev mailing list