Java 套接字输入和输出的独立线程

Java 套接字输入和输出的独立线程,java,multithreading,oop,sockets,legacy-code,Java,Multithreading,Oop,Sockets,Legacy Code,我被指派处理多线程java服务器的一些性能和随机崩溃问题。尽管线程和线程安全对我来说并不是真正的新主题,但我发现设计一个新的多线程应用程序可能比尝试调整一些遗留代码困难一半。为了寻找答案,我浏览了一些著名的书籍,但奇怪的是,只要我阅读了相关书籍并分析了提供的例子,一切似乎都很清楚。然而,当我第二次看到我应该处理的代码时,我对任何事情都不再有把握了!一定是理论知识太多,实际经验太少之类的 无论如何,回到话题上来,当我在做一些在线研究时,我遇到了。一直困扰我的问题是:在套接字上从两个单独的线程调用g

我被指派处理多线程java服务器的一些性能和随机崩溃问题。尽管线程和线程安全对我来说并不是真正的新主题,但我发现设计一个新的多线程应用程序可能比尝试调整一些遗留代码困难一半。为了寻找答案,我浏览了一些著名的书籍,但奇怪的是,只要我阅读了相关书籍并分析了提供的例子,一切似乎都很清楚。然而,当我第二次看到我应该处理的代码时,我对任何事情都不再有把握了!一定是理论知识太多,实际经验太少之类的

无论如何,回到话题上来,当我在做一些在线研究时,我遇到了。一直困扰我的问题是:在套接字上从两个单独的线程调用getInputStream()和getOutputStream()而不进行同步真的安全吗?还是我现在对整个线程安全问题有点太过偏执?当连续第五本书告诉你有多少事情可能会在并发性中出错时,我猜就是这样

抱歉,如果问题有点长,或者可能太“noobie”,请对我放轻松-这是我在这里的第一篇帖子

编辑:我想说清楚,我知道套接字在全双工模式下工作,同时使用它们的输入和输出流是安全的。当您在主线程中获取这些引用,然后用这些引用初始化线程对象时,我觉得这很好,但是在两个不同的线程中获取这些流是否也安全

@rsp:

所以我检查了Sun的代码,正如您所说,
PlainSocketImpl
在这两种方法上是同步的<然而,代码>套接字,却没有
getInputStream()
getOutputStream()
几乎都是
SocketImpl
的包装器,因此并发问题可能不会导致整个服务器崩溃。尽管如此,由于计时有点不走运,似乎事情可能会出错(例如,当方法已检查错误条件时,其他线程关闭套接字)


正如您所指出的,从代码结构的角度来看,最好为每个线程提供一个流引用,而不是整个套接字。如果不是因为每个线程也使用socket的
close()
方法(例如,当socket接收到“shutdown”命令时),我可能已经重新构造了我正在处理的代码。据我所知,这些线程的主要目的是将消息排队以供发送或处理,因此可能是违反了单一责任原则,这些线程不应该能够关闭套接字(与相比)?但是如果我继续分析代码太长时间,就会发现设计总体上有缺陷,整个过程都需要重写。即使管理层愿意为此付出代价,认真重构遗留代码、没有单元测试以及处理难以调试的并发问题,也可能弊大于利。不是吗?

套接字的输入流和输出流表示两个独立的数据流或通道。在线程中使用两个不同步的流是完全节省的。套接字流本身将阻止空缓冲区或满缓冲区上的读写

Edit:Sun的套接字实现类会同步
getInputStream()
getOutputStream()
方法,然后从不同的线程调用就可以了。但是,我同意您的看法,从代码结构的角度来看,将流传递给使用它们的线程可能更有意义(例如,依赖项注入有助于测试)