Java线程安全的单例模式实现,spring及mybatis源码解析:枚举实现及静态内部类实现

2023-06-19 16:10:28 浏览数 (2)


单例模式的实现-枚举


枚举实例单例是线程安全的,JVM类实例化会担保。

spring源码示例:

代码语言:javascript复制
public enum JdbcColumnTypes {

  INSTANCE {

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public Class<?> resolvePrimitiveType(Class<?> type) {

      return javaToDbType.entrySet().stream() //
          .filter(e -> e.getKey().isAssignableFrom(type)) //
          .map(e -> (Class<?>) e.getValue()) //
          .findFirst() //
          .orElseGet(() -> (Class) ClassUtils.resolvePrimitiveIfNecessary(type));
    }
  };

  private static final Map<Class<?>, Class<?>> javaToDbType = new LinkedHashMap<>();

  static {

    javaToDbType.put(Enum.class, String.class);
    javaToDbType.put(ZonedDateTime.class, String.class);
    javaToDbType.put(OffsetDateTime.class, OffsetDateTime.class);
    javaToDbType.put(LocalDateTime.class, LocalDateTime.class);
    javaToDbType.put(Temporal.class, Timestamp.class);
  }

  public abstract Class<?> resolvePrimitiveType(Class<?> type);
}

源码来自:

代码语言:javascript复制
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-jdbc</artifactId>
      <version>2.3.4</version>
    </dependency>

枚举,不仅仅为我们提供实现常量的定义,如java源码

代码语言:javascript复制
/**
 * Defines access modes used to test the accessibility of a file.
 *
 * @since 1.7
 */

public enum AccessMode {
    /**
     * Test read access.
     */
    READ,
    /**
     * Test write access.
     */
    WRITE,
    /**
     * Test execute access.
     */
    EXECUTE;
}

而且我们还可以实现方法(实例方法、静态方法、抽象方法),自定义业务逻辑

单例模式的实现-静态内部类


mybatis源码示例:

代码语言:javascript复制

public abstract class VFS {
 
 
  /** Singleton instance holder. */
  private static class VFSHolder {
    static final VFS INSTANCE = createVFS();

    
    static VFS createVFS() {
       .....
    }
  }

  /**
   * Get the singleton {@link VFS} instance. If no {@link VFS} implementation can be found for the current environment,
   * then this method returns null.
   *
   * @return single instance of VFS
   */
  public static VFS getInstance() {
    return VFSHolder.INSTANCE;
  }

  
}

源码来自:

代码语言:javascript复制
   <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
       <version>3.5.9</version>
    </dependency>

1、内部类是延迟加载的,JVM担保内部类的加载及实例化是线程安全的;

2、单例类的构造函数是private的;

3、内部类也是私有静态内部类;

4、私有静态内部类实例负责创建静态类实例,一般会创建属性INSTANCE并实例化;

5、单例类提供静态方法getInstance(),返回私有静态内部类的属性INSTANCE;

0 人点赞