I have several threads that run at the same time and some of them need to request data from Internet. Do I need to care about synchronization of their access to OkHttpClient
singleton?
For example,
...
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
}
}
...
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
}
}
Can simultaneous newCall().enque()
or newCall().execute()
be potentially dangerous?
You asked a very good question, allow me to expound holistically. Based on GitBub issues opened for OkHttp, my summary is this.
I believe a single instance of OkHttpClient should be reused to create multiple connections. Is
OkHttpClientthread safe? If not, is
OkHttpClient.open()` thread safe?
Yes. It is designed to be treated as a singleton. By using a single instance you are afforded a shared response cache, thread pool, connection re-use, etc. Definitely do this!
How about thread safety? Is OkHttpClient
thread safe or at least its open()
function?
Yes
OkHttpClient
s should be shared
OkHttp performs best when you create a single
OkHttpClient
instance and reuse it for all of your HTTP calls. This is because each client holds its own connection pool and thread pools. Reusing connections and threads reduces latency and saves memory. Conversely, creating a client for each request wastes resources on idle pools.