【设计模式】单例模式
程序员文章站
2022-07-10 19:15:04
定义 确保某个类只有一个实例 实现方式 饿汉式加载(线程安全) 等价于 懒汉式加载 非线程安全 线程安全 1. Double Check 2. 借助Lazy "示例代码 github" ......
设计模式之单例模式的学习。
单例模式的定义:属于创建型模式,重点在单字,保证一个类仅有一个实例,并提供一个访问它的全局访问点。
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
饿汉式(线程安全)
public class Singleton {
private static Singleton instance = new Singleton();
public Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
饿汉式,可以这样理解,由于饿,所以一开始就要有东西提供,所以在类加载时候就创建实例。
由于是在类加载时候创建实例,不会产生线程不安全
懒汉式(线程不安全)
public class Singleton {
private static Singleton instance;
public Singleton() {
}
public static Singleton getInstance() {
if (instance == null){
instance = new Singleton();
}
return instance;
}
}
懒汉式,比较懒,不需要我就不创建,需要的时候我才创建。
多线程中,线程是不安全的,因为可能多个线程进入if,即创建多个不同的对象。
懒汉式(加锁线程安全)
public class Singleton {
private static Singleton instance;
public Singleton() {
}
public static synchronized Singleton getInstance() {
if (instance == null){
instance = new Singleton();
}
return instance;
}
}
由于多个线程共享instance,所以干脆加把锁,这样的话,效率是肯定会有一定降低的。
懒汉式(双重校验锁)
public class Singleton {
private static volatile Singleton instance;
public Singleton() {
}
public static Singleton getInstance() {
if (instance == null){
synchronized (Singleton.class){
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
由上面我们发现,只有第一次创建时候可能存在线程安全问题,没必要整个加上锁。
所以采用双重校验锁,使用volatile关键词保证可见性。
本文地址:https://blog.csdn.net/Miiiiiiiiiii/article/details/112252167