以什么方式java.net.Socket线程安全?

lac*_*ker 9 java sockets thread-safety bufferedwriter bufferedreader

我有一个Socket,我通过BufferedReaders和BufferedWriters阅读和写入.我不确定哪些操作可以通过单独的线程完成.我猜想同时从两个不同的线程写入套接字是个坏主意.与从两个不同的线程同时读取套接字相同.在另一个线程上写入时在一个线程上读取怎么样?

我问,因为我想在读取时长时间阻塞一个线程,因为它等待更多数据,但在这个等待期间我也偶尔会在套接字上发送数据.我不清楚这是否是线程安全的,或者我是否应该在写入之前取消读取(这会很烦人).

Ale*_*man 5

您实际上是从InputStream读取并写入OutputStream.它们是相当独立的,只要你序列化对它们的访问,你就可以了.

但是,您必须将您发送的数据与您收到的数据相关联.这与线程安全不同.

  • >>> _只要你序列化对每个人的访问权限_:这不足以使访问线程安全,你必须确保使用用于序列化访问的相同锁来管理套接字状态.我建议,根本就不要这样做.使用缓冲区,并在一个线程中管理套接字读/写 (5认同)
  • 你是什​​么意思"对每个人进行序列化访问"? (3认同)
  • @gasan:不要一次尝试用两个线程写,或者一次用两个线程读.从某个同步块/方法调用读/写(一个锁用于读取,一个用于写入). (2认同)

msc*_*ker 5

套接字在流级别是线程不安全的.您必须提供同步.唯一的保证是,无论并发性,您都不会在不同的读取调用中获得完全相同字节的副本.

但是在Reader,特别是Writer级别,您可能会遇到一些锁定问题.

无论如何,你可以使用Socket的流处理读写操作,就像它们是完全独立的对象一样(它们是唯一共享的是它们的生命周期).

一方面,一方面提供了读者线程之间的正确同步,另一方面提供了编写者线程,任何数量的读者和编写者都可以.这意味着,是的,您可以在一个线程上读取并在另一个线程上写入(实际上这是非常频繁的),并且您不必在写入时停止读取.

最后一条建议:所有涉及线程的操作都有关联超时,请确保正确处理超时.