我有几个线程在同一时间运行,其中一些需要从互联网请求数据。我需要关心他们对OkHttpClient单例访问的同步吗?
例如,
Thread1:
...
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:
...
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()会有潜在的危险吗?
发布于 2018-01-31 09:49:59
你提出了一个非常好的问题,请允许我从整体上加以阐述。基于github为OkHttp开放的问题,我的总结是。
问:我认为应该重用OkHttpClient的单个实例来创建多个连接。OkHttpClient线程安全吗?如果不是,OkHttpClient.open()线程安全吗?
答案是:是的。它被设计成作为单例来处理。通过使用单个实例,您可以共享响应缓存、线程池、连接重用等。
问:线程安全性如何?OkHttpClient线程安全吗?至少它的open()函数是安全的吗?
回答:是的。
结论:
应该共享OkHttpClients
当您创建单个
实例并将其重用于所有OkHttpClient调用时,HTTP的性能最佳。这是因为每个客户端都有自己的连接池和线程池。重用连接和线程可以减少延迟并节省内存。相反,为每个请求创建一个客户端会浪费空闲池上的资源。
https://stackoverflow.com/questions/48532860
复制相似问题