code: @SuppressWarnings({"Since15"})
      public static List<AttachProvider> providers() {
          synchronized (lock) {
              if (providers == null) {
                  providers = new ArrayList<AttachProvider>();
                  
                  ServiceLoader<AttachProvider> providerLoader =
                      ServiceLoader.load(AttachProvider.class, AttachProvider.class.getClassLoader());
                  
                  for (AttachProvider aProviderLoader : providerLoader) {
                      try {
                          providers.add(aProviderLoader);
                      } catch (ThreadDeath td) {
                          throw td;
                      } catch (Throwable t) {
                          // Ignore errors and exceptions.
                          System.err.println(t);
                      }
                  }
              }
              
              return Collections.unmodifiableList(providers);
          }
      }
docs: <p>
  Returns a list of the installed attach providers.
  <p/>
  <p>An AttachProvider is installed on the platform if:
  <p/>
  <ul>
  <li><p>It is installed in a JAR file that is visible to the defining
  class loader of the AttachProvider type (usually, but not required
  to be, the {@link java.lang.ClassLoader#getSystemClassLoader system
  class loader}).</p></li>
  <li><p>The JAR file contains a provider configuration named
  <tt>com.sun.tools.attach.spi.AttachProvider</tt> in the resource directory
  <tt>META-INF/services</tt>. </p></li>
  <li><p>The provider configuration file lists the full-qualified class
  name of the AttachProvider implementation. </p></li>
  </ul>
  <p> The format of the provider configuration file is one fully-qualified
  class name per line. Space and tab characters surrounding each class name,
  as well as blank lines are ignored. The comment character is
  <tt>'#'</tt> (<tt>0x23</tt>), and on each line all characters following
  the first comment character are ignored. The file must be encoded in
  UTF-8. </p>
  <p> AttachProvider implementations are loaded and instantiated
  (using the zero-arg constructor) at the first invocation of this method.
  The list returned by the first invocation of this method is the list
  of providers. Subsequent invocations of this method return a list of the same
  providers. The list is unmodifable.</p>
  
  @return A list of the installed attach providers.