【问题标题】:Is it thread-safe to make calls to OkHttpClient in parallel?并行调用 OkHttpClient 是否是线程安全的?
【发布时间】:2018-07-10 00:19:54
【问题描述】:

我有几个线程同时运行,其中一些需要从 Internet 请求数据。我需要关心他们对 OkHttpClient 单例的访问同步吗?

例如,

线程1:

...
Request request = new Request.Builder()
    .url("http://hell.com/siners.txt")
    .build();

client.newCall(request).enqueue(new Callback() {
  @Override public void onFailure(Call call, IOException e) {
    e.printStackTrace();
  }

  @Override public void onResponse(Call call, Response response) throws IOException {
    try (ResponseBody responseBody = response.body()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
      // Some work in Thread1
    }
  }

线程2:

...
Request request = new Request.Builder()
    .url("http://hell.com/slutList.txt")
    .build();

client.newCall(request).enqueue(new Callback() {
  @Override public void onFailure(Call call, IOException e) {
    e.printStackTrace();
  }

  @Override public void onResponse(Call call, Response response) throws IOException {
    try (ResponseBody responseBody = response.body()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
      // Some work in Thread2
    }
  }

同时 newCall().enque() 或 newCall().execute() 是否有潜在危险?

【问题讨论】:

  • 你能提供更多背景信息吗,代码是可取的,只有这样才能进行适当的讨论
  • @Remario,已编辑
  • 好吧,看起来不错,在我回答之前,你考虑过改造吗?
  • 检查我无聊的答案!
  • 我想用 Retrofit 但我需要先了解更多关于 Android 平台的知识。

标签: java android thread-safety okhttp


【解决方案1】:

你问了一个很好的问题,请允许我从整体上进行阐述。基于为 OkHttp 打开的 github 问题,我的总结是这样的。

问题: 我相信应该重用 OkHttpClient 的单个实例来创建多个连接。 OkHttpClient 线程安全吗?如果不是,OkHttpClient.open() 线程安全吗?

回答: 是的。它被设计为被视为单例。通过使用单个实例,您可以获得共享响应缓存、线程池、连接重用等。一定要这样做!

问题: 线程安全如何? OkHttpClient 线程是安全的还是至少是它的 open() 函数?

回答: 是的

结论:

应该共享 OkHttpClients

当您创建单个 OkHttpClient 实例并将其重用于所有 HTTP 调用时,OkHttp 性能最佳。这是因为每个客户端都拥有自己的连接池和线程池。重用连接和线程可减少延迟并节省内存。相反,为每个请求创建一个客户端会浪费空闲池上的资源。

【讨论】:

  • 我正在使用 OkHttp3。如果我对多个域(如 https://api_1.test.comhttps://api_2.test.com)进行 http 调用,那么我应该使用多个 OkHttpClient 还是单个客户端就足够了?
猜你喜欢
  • 1970-01-01
  • 2019-06-27
  • 2018-03-12
  • 2017-04-21
  • 2012-08-21
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多