首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >并行调用OkHttpClient是线程安全的吗?

并行调用OkHttpClient是线程安全的吗?
EN

Stack Overflow用户
提问于 2018-01-31 08:57:06
回答 1查看 9.5K关注 0票数 35

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

例如,

Thread1:

代码语言:javascript
运行
复制
...
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
    }
  }

Thread2:

代码语言:javascript
运行
复制
...
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()会有潜在的危险吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-31 09:49:59

你提出了一个非常好的问题,请允许我从整体上加以阐述。基于github为OkHttp开放的问题,我的总结是。

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

答案是:是的。它被设计成作为单例来处理。通过使用单个实例,您可以共享响应缓存、线程池、连接重用等。

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

回答:是的。

结论:

应该共享OkHttpClients

当您创建单个

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

票数 51
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48532860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档