我试图了解SocketChannels和NIO.我知道如何使用常规套接字以及如何创建一个简单的每个客户端线程服务器(使用常规阻塞套接字).
所以我的问题:
A selectable channel for stream-oriented connecting sockets..那是什么意思?我已经阅读了这个文档,但不知怎的,我没有得到它...
假设我有两个线程,T1和T2.
线程T1在TCP套接字S上进行阻塞write()调用,以发送大量字节B1的缓冲区.字节B1的缓冲区很大,以至于(a)写调用块和(b)TCP必须使用多个段来发送缓冲区.
线程T2还在同一个TCP套接字S上进行阻塞write()调用,以发送一些其他大的字节B2缓冲区.
我的问题是:
在UNIX上实现TCP是否保证B1的所有字节都将在B2的所有字节之前发送(反之亦然)?
或者TCP是否可能交错B1和B2的内容(例如,TCP发送带有B1数据的段,然后是带有B2数据的段,然后是带有B1数据的段).
PS - 我知道这样做并不是一个好主意.我正在尝试确定一些我没写的代码是否正确.
已经有一段时间了,因为我已经将哈希表用于任何重要的事情,但我似乎记得get()和put()方法是同步的.
JavaDocs没有反映这一点.他们只是说Hashtable类是同步的.我能假设什么?如果多个线程同时访问哈希表(假设它们没有修改相同的条目),则操作将成功,对吧?我想我要问的是"java.util.Hashtable线程安全吗?"
请指导我摆脱这个问题......
我知道Java套接字的线程安全性已经在stackoverflow上的几个线程中讨论过了,但是我还没有找到这个问题的明确答案 - 在实践中,是否可以安全地让多个线程同时写入同一个SocketOutputStream,或者是否存在从一个线程发送的数据与来自另一个线程的数据混淆的风险?(例如,另一端的接收器首先接收一个线程消息的前半部分,然后接收来自另一个线程消息的一些数据,然后接收第一个线程消息的其余部分)
我之所以说"在实践中"的原因是我知道Socket类没有被记录为线程安全的,但是如果它在当前的实现中实际上是安全的,那么这对我来说已经足够了.我最感兴趣的具体实现是在Linux上运行的Hotspot.
当热点的实现中SocketOutputStream了Java层,更具体socketWrite的实现()看,它看起来像它应该是线程安全的,只要本机实现socketWrite0的()是安全的.然而,在寻找该方法的FPGA实现时(J2SE/SRC/solaris的/天然的/爪哇/净/ SocketOutputStream.c),它似乎分割要被发送到的64或128KB的块的数据(取决于它是否是一个64位JVM)然后以单独写入的方式发送块.
所以 - 对我来说,看起来从不同的线程发送超过64kb是不安全的,但如果它低于64kb它应该是安全的...但我很可能会错过这里重要的东西.这里有没有其他人看过这个并得出不同的结论?