https://github.com/apache/dubbo/blob/501e4dbdf9d93b8d5b59400cff3bdac5ea89fbc4/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AsyncToSyncInvoker.java#L54

The above `result.get()` will eventually delegate to [CompletableFuture.get()](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html#get--). I checked the implementation provided in JDK 8, it will first spin-waiting for the countdown of 256 (the eighth power of 2) and then park the thread. I believe it's the unnecessary spin that caused the bad performance.

When running under JDK 11, the performance performs well as the previous versions, I still does not check the difference between these two implementations yet.

Thank @Jeff-Lv for help finding this issue.
import org.apache.dubbo.remoting.RemotingException;
import org.apache.dubbo.remoting.TimeoutException;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.InvokeMode;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Result;
import org.apache.dubbo.rpc.RpcException;
import org.apache.dubbo.rpc.RpcInvocation;
import java.util.concurrent.ExecutionException;
/**
 * This class will work as a wrapper wrapping outside of each protocol invoker.
 * @param <T>
 */
public class AsyncToSyncInvoker<T> implements Invoker<T> {
    private Invoker<T> invoker;
    public AsyncToSyncInvoker(Invoker<T> invoker) {
        this.invoker = invoker;
    }
    @Override
    public Class<T> getInterface() {
        return invoker.getInterface();
    }
    @Override
    public Result invoke(Invocation invocation) throws RpcException {
        Result asyncResult = invoker.invoke(invocation);
        try {
            if (InvokeMode.SYNC == ((RpcInvocation)invocation).getInvokeMode()) {
                asyncResult.get();
            }
        } catch (InterruptedException e) {