OkHttpClient的execute()方法中synchronized block的优势是什么
What is the advantage of synchronized block in OkHttpClient's execute() method
我正在阅读 OkHttp 的源代码。
这是 execute()
inRealCall.java
:
public Response execute() throws IOException {
synchronized (this) {
if (executed) throw new IllegalStateException("Already Executed");
executed = true;
}
captureCallStackTrace();
try {
client.dispatcher().executed(this);
Response result = getResponseWithInterceptorChain();
if (result == null) throw new IOException("Canceled");
return result;
} finally {
client.dispatcher().finished(this);
}
}
synchronized 有什么好处?
synchronized (this) {
if (executed) throw new IllegalStateException("Already Executed");
executed = true;
}
我认为这段代码没有任何不同之处(没有同步)
if (executed) throw new IllegalStateException("Already Executed");
executed = true;
例如,如果同时发出三个请求。
请求一个将通过,
请求二会抛出异常,
请求三将不会执行。
无论是否同步,代码都没有区别!
那么,为什么他们在那里写同步?
在这种情况下,同步通过防止不同线程对对象的并发访问来确保thread safety。
if (exectued)
在该块中只是检查操作是否已经发生。
我正在阅读 OkHttp 的源代码。
这是 execute()
inRealCall.java
:
public Response execute() throws IOException {
synchronized (this) {
if (executed) throw new IllegalStateException("Already Executed");
executed = true;
}
captureCallStackTrace();
try {
client.dispatcher().executed(this);
Response result = getResponseWithInterceptorChain();
if (result == null) throw new IOException("Canceled");
return result;
} finally {
client.dispatcher().finished(this);
}
}
synchronized 有什么好处?
synchronized (this) {
if (executed) throw new IllegalStateException("Already Executed");
executed = true;
}
我认为这段代码没有任何不同之处(没有同步)
if (executed) throw new IllegalStateException("Already Executed");
executed = true;
例如,如果同时发出三个请求。
请求一个将通过,
请求二会抛出异常,
请求三将不会执行。
无论是否同步,代码都没有区别!
那么,为什么他们在那里写同步?
同步通过防止不同线程对对象的并发访问来确保thread safety。
if (exectued)
在该块中只是检查操作是否已经发生。