我知道java套接字的线程安全已经在stackoverflow上的几个线程中讨论过,但我无法找到这个问题的明确答案 - 实际上,让多个线程同时写入同一个线程是否安全SocketOutputStream,或者是否存在从一个线程发送的数据与来自另一个线程的数据混淆的风险?(例如,另一端的接收者首先接收一个线程消息的前半部分,然后从另一个线程的消息中接收一些数据,然后是第一个线程的消息的其余部分)
我说“在实践中”的原因是我知道 Socket 类没有记录为线程安全的,但如果它在当前实现中实际上是安全的,那么这对我来说已经足够了。我最好奇的具体实现是在 Linux 上运行的 Hotspot。
在查看热点实现的Java层时,更具体地说是SocketOutputStream中socketWrite()的实现,只要socketWrite0()的本机实现是安全的,它看起来应该是线程安全的。但是,在查看该方法的实现时(j2se/src/solaris/native/java/net/SocketOutputStream.c),它似乎将要发送的数据拆分为 64 或 128kb 的块(取决于它是 64 位JVM),然后在单独的写入中发送块。
所以 - 对我来说,从不同的线程发送超过 64kb 的数据似乎是不安全的,但如果它小于 64kb,它应该是安全的......但我很可能在这里遗漏了一些重要的东西。这里有没有其他人看过这个并得出不同的结论?