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) 在该块中只是检查操作是否已经发生。