微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SocketOutputStream的线程安全性

我知道java套接字的线程安全已经在这里的几个线程讨论了stackoverflow,但我一直没能find一个明确的答案这个问题 – 是否在实践中,安全地有多个线程同时写入相同SocketoutputStream,还是有从一个线程发送的数据与来自另一个线程的数据混淆的风险? (例如,另一端的接收器首先接收一个线程的消息的前半部分,然后接收来自另一个线程的消息的一些数据,然后接收第一个线程的消息的剩余部分)

我之所以说“在实践中”的原因是我知道Socket类没有被logging为线程安全的,但是如果在当前的实现中它确实是安全的,那对我来说就足够了。 我最感兴趣的具体实现是在Linux上运行Hotspot。

在查看热点实现的Java层(更具体地说是SocketoutputStream中的socketWrite())的实现时,只要socketWrite0()的本地实现是安全的,它看起来应该是线程安全的。 然而,在查看这个方法的实现(j2se / src / solaris / native / java / net / SocketoutputStream.c)时,它似乎将要发送的数据分成64或128kb的块(取决于它是否是64位JVM),然后以单独的写入方式发送块。

所以 – 对我来说,从不同的线程发送超过64kb是不安全的,但如果它小于64kb应该是安全的…但是我很可能会错过这里重要的东西。 这里有没有其他人看过这个,得出不同的结论?

服务器发送RST消息

我可以禁用单个应用程序的TCP窗口缩放吗?

UDP服务器给分段错误

为什么在应用程序退出后,unix-socket文件仍然存在? 我可以使用旧文件创build新服务器吗?

Linux操作系统。 SOL_NETLINK没有定义

套接字写入公平性()在2个并行连接?

EAGAIN是否会返回缓冲区已满以外的任何内容

从C ++应用程序启动Linux服务时避免套接字inheritance

从linux套接字读取“varint”

我可以同时从几个线程调用一个套接字的accept()吗?

我认为如此严重依赖于可以改变的东西的实现细节是一个非常糟糕的主意。 如果你做这样的事情,你将不得不非常小心地控制你所使用的一切版本,以确保它是你期望的,这是非常困难的。 而且你还必须拥有一个非常强大的测试套件来验证多线程操作的正确性,因为你需要依靠代码检查和来自StackOverflow上的随机流言来解决问题。

为什么不能将SocketoutputStream封装到另一个直通OutputStream中,然后在该级别添加必要的同步? 这样做比较安全,而且你不太可能出现意想不到的问题。

根据这个文档http://www.docjar.com/docs/api/java/net/SocketoutputStream.html ,类不声称是线程安全的,因此认为它不是。 它从FileOutputStream继承,它通常文件I / O本质上不是线程安全的。

我的建议是,如果课程与硬件或通信相关,则不是线程安全的或“阻塞的”。 原因是线程安全的操作消耗更多的时间,你可能不喜欢。 我的背景不是Java,而是其他图书馆在哲学上是相似的。

我注意到你广泛地测试了这个类,但是你可能整天都在测试它,而且这个测试可能无法证明我的2分。

祝你好运,玩得开心。

Tommy Kwee

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐