前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java线程安全的单例模式实现,spring及mybatis源码解析:枚举实现及静态内部类实现

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

作者头像
崔认知
发布2023-06-19 16:10:28
1930
发布2023-06-19 16:10:28
举报
文章被收录于专栏:nobody

单例模式的实现-枚举


枚举实例单例是线程安全的,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;

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 认知科技技术团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档