osc*_*r11 5 java sockets linux multithreading
我知道Java套接字的线程安全性已经在stackoverflow上的几个线程中讨论过了,但是我还没有找到这个问题的明确答案 - 在实践中,是否可以安全地让多个线程同时写入同一个SocketOutputStream,或者是否存在从一个线程发送的数据与来自另一个线程的数据混淆的风险?(例如,另一端的接收器首先接收一个线程消息的前半部分,然后接收来自另一个线程消息的一些数据,然后接收第一个线程消息的其余部分)
我之所以说"在实践中"的原因是我知道Socket类没有被记录为线程安全的,但是如果它在当前的实现中实际上是安全的,那么这对我来说已经足够了.我最感兴趣的具体实现是在Linux上运行的Hotspot.
当热点的实现中SocketOutputStream了Java层,更具体socketWrite的实现()看,它看起来像它应该是线程安全的,只要本机实现socketWrite0的()是安全的.然而,在寻找该方法的FPGA实现时(J2SE/SRC/solaris的/天然的/爪哇/净/ SocketOutputStream.c),它似乎分割要被发送到的64或128KB的块的数据(取决于它是否是一个64位JVM)然后以单独写入的方式发送块.
所以 - 对我来说,看起来从不同的线程发送超过64kb是不安全的,但如果它低于64kb它应该是安全的...但我很可能会错过这里重要的东西.这里有没有其他人看过这个并得出不同的结论?
我认为如此严重依赖于某些可能发生变化的实施细节是一个非常糟糕的主意.如果您执行此类操作,则必须非常小心地控制所使用的所有内容的版本,以确保它符合您的期望,并且这很难做到.此外,您还必须拥有一个非常强大的测试套件,以验证多线程操作是否正常运行,因为您依赖于代码检查以及StackOverflow上用于解决方案的传言.
为什么不能将SocketOutputStream包装到另一个直通OutputStream中,然后在该级别添加必要的同步?这样做更安全,你不太可能在未来遇到意想不到的问题.
归档时间: |
|
查看次数: |
2210 次 |
最近记录: |