【问题标题】:Java: Is it good practice to do static HTTP Requests?Java:做静态 HTTP 请求是个好习惯吗?
【发布时间】:2019-01-22 16:03:01
【问题描述】:

我刚刚和一位同事讨论过,他问我为什么要像这样做一个静态 Http 请求:

HttpClient.doGet(HashMap<String,String> Parameters);

而不是通过默认构造函数调用类的对象,而是使用这样的非静态方法:

new HttpClient().doGet(HashMap<String,String> Parameters)

如果假设 doGet 方法的实现只使用函数的参数而没有任何成员变量,那么静态实现会不会有任何问题,例如线程安全?

【问题讨论】:

  • 如果doGet 方法不使用HttpClient 类中的任何共享变量,那么不会有任何明显的问题。还假设客户端每次请求使用一次 parameters 映射。
  • 请记住,`new HttpClient()' 也是一个静态方法调用。
  • @jrahhali 为什么?这就是我调用对象的新实例的原因。
  • @flixe 为什么?

标签: java multithreading static thread-safety


【解决方案1】:

这取决于您所说的有问题的含义,但仅从您给定的示例来看,答案是否定的,静态方法调用没有问题,并且可以说更好,因为不需要实例化对象。

您提到了线程安全,所以我会谈到这一点。如果涉及“可变共享状态”,您只需要考虑线程安全。可变是这里的关键词。例如,如果多个线程共享同一个 HttpClient 实例,并且 HttpClient 通过改变其一个或多个成员变量来跟踪某些状态,那么这肯定有可能出现问题。

【讨论】:

    【解决方案2】:

    ...而且,每个 HTTP 请求都必须通过网络发送到其他地方的物理计算机,然后返回,“至少在很多 毫秒- 秒后”。因此,“多线程” 琐事真的没有意义。单个线程可以负责向远程主机发送并行 I/O 请求,通过一些线程安全队列接收来自其余代码的请求,并以类似方式在另一个队列上返回响应(或,排队)。

    将“线程”与“请求”相关联是一种浪费。一小部分工作人员可能会消耗来自该回复队列的响应。

    (当然,有很多现有的 Java 开源框架可以为您实现所有这些非常熟悉的管道。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 2021-07-23
      • 1970-01-01
      • 2023-02-19
      • 2012-03-10
      • 1970-01-01
      • 2016-01-03
      相关资源
      最近更新 更多