public static synchronized CodeGenerator getSharedCodeGenerator(ClassLoader... classLoaders) {
    DelayedRef<CodeGenerator> codeGeneratorWeakRef = sharedCodeGenerator2.get(classLoaders);
    CodeGenerator codeGenerator = codeGeneratorWeakRef != null ? codeGeneratorWeakRef.get() : null;
    if (codeGenerator == null) {
      codeGenerator = new CodeGenerator(new ClassLoaderUtils.ComposedClassLoader(classLoaders));
      sharedCodeGenerator2.put(classLoaders, new DelayedRef<>(codeGenerator));
    }
    return codeGenerator;
  }
@Test
  public void testGetSharedCodeGenerator() {
    CodeGenerator.getSharedCodeGenerator(getClass().getClassLoader());
    System.gc();
    assertNotNull(sharedCodeGenerator.get(getClass().getClassLoader()).get());
    CodeGenerator.getSharedCodeGenerator(getClass().getClassLoader(), Fury.class.getClassLoader());
    System.gc();
    assertNotNull(
        sharedCodeGenerator2
            .get(new Object[] {getClass().getClassLoader(), Fury.class.getClassLoader()})
            .get());
  }