Java httpurlconnection线程安全

Java httpurlconnection线程安全,java,.net,multithreading,httpurlconnection,Java,.net,Multithreading,Httpurlconnection,HttpUrlConnection是线程安全的吗?也就是说,如果我有一个连接到服务器的HttpConnection实例,并且该实例被不同的线程使用(例如,尝试同时发送帖子),HttpUrlConnection将如何处理这种情况?a) 他们是串行发送帖子,还是b)第一个线程发送帖子,得到响应,然后第二个线程发送帖子?如果它们以串行方式发送POST,这意味着将多个活动POST发送到同一tcp连接。允许这样做吗?它可以由服务器处理吗 谢谢,这不是线程安全的 您不应该缓存/共享连接。只需为每个请求创建一

HttpUrlConnection是线程安全的吗?也就是说,如果我有一个连接到服务器的HttpConnection实例,并且该实例被不同的线程使用(例如,尝试同时发送帖子),HttpUrlConnection将如何处理这种情况?a) 他们是串行发送帖子,还是b)第一个线程发送帖子,得到响应,然后第二个线程发送帖子?如果它们以串行方式发送POST,这意味着将多个活动POST发送到同一tcp连接。允许这样做吗?它可以由服务器处理吗

谢谢,这不是线程安全的

您不应该缓存/共享连接。只需为每个请求创建一个新连接。创建新连接当然会有一点开销,但它非常小,您不必担心

HTTP的精神实际上是无连接的。从语义上讲,客户端和服务器之间没有连接。客户端发送一个请求,服务器发回一个响应,仅此而已

虽然现在HTTP确实是在TCP之上定义的,TCP是一种连接完整的协议,HTTP可能会对多个请求/响应使用长寿命的TCP连接,但这不是HTTP的本质

由于交换的请求-响应可以在大多数网络协议之上实现,所以最初HTTP允许指定底层协议。我们可以想象通过电子邮件进行http请求/响应交换-
http:/smtp/www.example.com
;可能是RMI-
http:/RMI/www.example.com
;默认值是TCP,因此
http://
实际上意味着
http:/TCP/


今天,只使用TCP,我们只剩下这个奇怪的双斜杠分隔符。但它提醒我们,HTTP对TCP的依赖是相当偶然的。

文档中没有说明它是否存在。查看代码()后,看起来getInputStream和getOutputStream是同步的。我确实担心的是,如果你有一个线程获得一个输入流,同时你有另一个线程获得一个输出流,你可能会得到你的信号交叉。inputStream和outputStream是可能不应该在线程之间共享的实例变量


如果我是你,我会实现一个队列,允许你将消息发布到队列,然后一次发布一条消息到服务器。当请求返回时,您只需调用回调。这将确保在响应返回之前未发送请求。

我怀疑,底层套接字不能是线程安全的,至少您会收到消息损坏。您说底层套接字不能是线程安全的是什么意思?它没有实现为同步?我理解你的意思。但是,您关于按请求创建新连接的建议不是一种HTTP1.0方法吗?另外,通过说我不应该缓存连接,您实际上是指避免连接池方案?我的意图是通过多个请求重用已建立的连接,以避免三方握手开销。此外,我想知道是否可以在同一tcp连接上“推送”多个POST请求。我是否完全偏离了轨道?如果您真的关心性能,请打开一个原始TCP连接,并向其写入您的请求。试试看,它非常简单,因为HTTP是一种简单的设计。您可能有多个线程写入同一个TCP连接,但是您需要同步,以便一次只有一个线程这样做。每个线程有一个连接会更好。如果有多个连接打开到服务器,吞吐量可能会提高。当您说“多个线程写入同一个TCP连接,但是您需要同步,以便一次只有一个线程执行此操作”时,您的意思是每个线程发送POST并获得响应,然后下一个线程接受TCP连接?很抱歉,但我不清楚使用原始tcp连接如何比使用httpurlconnection有所改进?为什么不同步httpurlconnection访问?请你再解释一下好吗?你说的很有道理。不过我想知道,如果不是信号交叉的更糟情况,我们是否有以下情况:thread1和thread2共享httpurlconnection。两个线程都尝试执行POST。Thread2将阻塞,因为getOutputStream已同步。Thread1完成请求的写入并锁定结果的输入流。Thread2获取输出流并写入POST。然后在inputstream中thread2块。此时,同一tcp连接中有2个活动POST。服务器是否有可能处理此问题?因此,响应的顺序是正确的?@user384706文档并没有说它是线程安全的,代码说只有某些部分是同步的,您需要在上面添加一个层以使其线程安全。如果你自己做,你将面临巨大的风险,如果失败,你将很难找出问题所在。如果我是你,我会看一个被证明是线程安全的实现,比如,而不必担心它。@Romain Hippeau如果我们创建一个HttpUrlConnection的新实例,每个线程都有相同的URL,会怎么样?会有什么不利之处吗?