Channel.isWritable() 是否可以从非 I/O thead 正确使用?
Is Channel.isWritable() can be used correctly from non I/O thead?
在 Channel
的 javadoc 中,它没有说 isWritable()
不应该被与其 I/O 线程不同的线程使用。所以我认为答案应该是肯定的。但是在 Channel.Unsafe
javadoc 中说它的方法必须从 I/O 线程调用(少数除外)。
AbstractChannel.isWritable()
是通过将不安全代码调用到 return 和 outboundBuffer
并对其调用 isWritable()
来实现的。
那么如果从非 I/O 线程调用 Channel.isWriable()
是否违反了 Unsafe
javadoc 中的指示?
AbstractChannel.AbstractUnsafe#outboundBuffer
(引用)不是 final 且不是易失性的事实是否使得它可能对通道的 I/O 线程(事件循环)以外的其他线程永远不可见?
它已在 4.0.39.Final 和 4.1.3.Final 中通过将 AbstractChannel.AbstractUnsafe#outboundBuffer 更改为易失性来修复。
http://netty.io/news/2016/07/15/4-0-39-Final-4-1-3-Final.html
因此,在这些构建上,从任何线程使用 Channel.isWritable() 应该是安全的。
在 Channel
的 javadoc 中,它没有说 isWritable()
不应该被与其 I/O 线程不同的线程使用。所以我认为答案应该是肯定的。但是在 Channel.Unsafe
javadoc 中说它的方法必须从 I/O 线程调用(少数除外)。
AbstractChannel.isWritable()
是通过将不安全代码调用到 return 和 outboundBuffer
并对其调用 isWritable()
来实现的。
那么如果从非 I/O 线程调用 Channel.isWriable()
是否违反了 Unsafe
javadoc 中的指示?
AbstractChannel.AbstractUnsafe#outboundBuffer
(引用)不是 final 且不是易失性的事实是否使得它可能对通道的 I/O 线程(事件循环)以外的其他线程永远不可见?
它已在 4.0.39.Final 和 4.1.3.Final 中通过将 AbstractChannel.AbstractUnsafe#outboundBuffer 更改为易失性来修复。
http://netty.io/news/2016/07/15/4-0-39-Final-4-1-3-Final.html
因此,在这些构建上,从任何线程使用 Channel.isWritable() 应该是安全的。