type
status
date
slug
summary
tags
category
icon
password
🔏
单例模式分为饿汉式(线程安全)和懒汉式(线程不安全)。
单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式分为饿汉式(线程安全)和懒汉式(线程不安全)。
  • 饿汉式的意思是很饿,迫不及待在类加载的时候就创建出全局唯一的实例,外部调用静态方法的时候直接返回,由于类加载的过程在JVM中进行,往往是线程安全的,不需要加锁。如果是简单快速的场景,很适合用饿汉式
  • 懒汉式的意思是很懒,等用到的时候,再创建全局唯一实例,有点懒加载的意思。由于懒汉式创建实例是在静态方法中,所以不能保证线程安全,所以需要加锁处理。比较适合复杂且资源消耗大的场景

下面是单线程时的两种单例模式代码:

下面是线程安全的懒汉式代码:
这里需要解释一下为什么需要在锁前后判断两次实例是否为空。第一次判空很好理解,因为需要保持全局唯一;第二次判空是为了防止如果两个线程都通过了第一次判空,这时如果没有第二次判空,就不能维持全局唯一了,虽然执行的时候还是线性一个一个执行的,但是会先后创建两个实例,违反了单例原则。