Synchronized on `String#intern` is a bad practice, interning a string will make it a global object .Which means if you synchronized the same interned strings in different parts of your code , some shit'll happen ,eg : deadlock

https://github.com/alibaba/dubbo/blob/9cf27a36848c22fbfd00877449fbe0eaf53e040c/dubbo-rpc/dubbo-rpc-default/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/DubboProtocol.java#L333
}
    private void optimizeSerialization(URL url) throws RpcException {
        String className = url.getParameter(Constants.OPTIMIZER_KEY, "");
        if (StringUtils.isEmpty(className) || optimizers.contains(className)) {
            return;
        }
        logger.info("Optimizing the serialization process for Kryo, FST, etc...");
        try {
            Class clazz = Thread.currentThread().getContextClassLoader().loadClass(className);
            if (!SerializationOptimizer.class.isAssignableFrom(clazz)) {
                throw new RpcException("The serialization optimizer " + className + " isn't an instance of " + SerializationOptimizer.class.getName());
            }
            SerializationOptimizer optimizer = (SerializationOptimizer) clazz.newInstance();
            if (optimizer.getSerializableClasses() == null) {
                return;
            }
            for (Class c : optimizer.getSerializableClasses()) {
                SerializableClassRegistry.registerClass(c);
            }
            optimizers.add(className);
        } catch (ClassNotFoundException e) {
            throw new RpcException("Cannot find the serialization optimizer class: " + className, e);
        } catch (InstantiationException e) {
            throw new RpcException("Cannot instantiate the serialization optimizer class: " + className, e);
        } catch (IllegalAccessException e) {
            throw new RpcException("Cannot instantiate the serialization optimizer class: " + className, e);
        }
    }
    @Override
    public <T> Invoker<T> refer(Class<T> serviceType, URL url) throws RpcException {