OkHttpClient的execute()方法中synchronized块的优点是什么

时间:2016-09-22 04:02:17

标签: java exception synchronized okhttp3

我正在阅读OkHttp的源代码 以下是execute()中的RealCall.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 (this) {
      if (executed) throw new IllegalStateException("Already Executed");
      executed = true;
    }

我认为此代码没有任何不同之处(没有同步)

if (executed) throw new IllegalStateException("Already Executed");
executed = true;

例如,如果有三个请求同时发出。
要求一个人会通过,
请求两个会抛出异常,
请求三将不会执行。

是否存在同步,代码不起作用!

那么,为什么他们在那里写同步?

1 个答案:

答案 0 :(得分:0)

在这种情况下同步可以通过防止不同线程对对象的并发访问来确保thread safety

该块中的

if (exectued)只是检查操作是否已经发生。