单例模式

Java实现

饿汉式、线程安全、最简单的方式

/**
 * 静态变量实现方式、线程安全、饿汉式; 是最常用的一种方式
 *
 * @author yangsx
 * @version 1.0
 * @date 2019/9/11
 */
public class S1_HungerImplement {

    private static final S1_HungerImplement INSTANCE = new S1_HungerImplement();

/*    static {
        INSTANCE = new S1_StaticFieldImplements();
    }*/

    private S1_HungerImplement() {
    }

    public static S1_HungerImplement getInstance() {
        return INSTANCE;
    }
}

懒汉式、非线程安全、最简单的方式

懒汉式、线程安全、同步方法

懒汉式、线程安全、双重检查锁

同步方法的线程安全模式,缺点很明显,因为对象的创建之前,可能会做很多耗时操作,所以优化如下:

但是这种方式,是一种错误的实现方式,因为判断与初始化不是一个原子操作,有可能初始化多次。所以,使用双重检查锁替换该方式:

懒汉式、静态内部类

懒汉式、Enum实现、比较完美

饿汉式、容器单例

Golang实现

饿汉式、并发安全

懒汉式、并发不安全

懒汉式、并发安全、加锁

懒汉式、并发安全、双重检查锁

懒汉式、并发安全、sync.Once

JDK中的单例模式

  • java.lang.Runtime#getRuntime(),饿汉式、线程安全、最简单的方式

  • java.awt.Desktop#getDesktop(),懒汉式、线程安全、同步方法

  • java.lang.System#getSecurityManager()

MyBatis ErrorContext

ErrorContext类用于记录本次执行过程中相关上下文信息,待发生Error时候其他组件就可以从本类实例中获取到相关的上下文信息。因为使用了ThreadLocal<T>, 我们就能直接取到之前执行本SQL的线程上的信息, 也就很方便的构建出异常发生时的上下文,快速排错

最后更新于

这有帮助吗?