101单例模式

262 阅读1分钟

定义

确保一个类只能有一个实例,而且自行实例化,并向整个系统提供这个实例。(三个特征)

方式:

  •  饿汉式
  •  懒汉式 (双重检测机制,必须要volatile 防止指令重排)

类图

代码

public class SingletonPattern {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        System.out.println(singleton.toString());
    }
}

class Singleton{
    //饿汉式
  //  private static com.mxy.dp.Singleton singleton =new com.mxy.dp.Singleton();
    //懒汉式
    private volatile  static Singleton singleton;
    private Singleton(){}

    public static Singleton getInstance(){
        if(singleton==null){
            synchronized (Singleton.class){
                if(singleton==null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

场景

知识点

1、类的静态变量是它本身的对象。

2、Synchronized 双重检查机制

(1) 假设有两个线程A和B,都进行完第一次判空了(不存在这样的对象), 进入Synchronized

(2) 这个时候A线程获取了类锁,然后B线程被阻塞,A线程新建了一个实例后释放了锁,B线程获取锁,又新建了一个实例,这破坏了单例设计模式的初衷。(保证单例)

3、Volatile 防止指令重排, 必须先从主存刷新最新的值,每次写入后必须立即同步回主存当中

4、单例模式是否全局唯一

单例模式是全局唯一,但是(1)在分布式系统中,会有多个JVM虚拟机,各个虚拟机都一个实例。(2)一个JVM虚拟机,但是多个类加载器加载这个类,也会产生多个实例。

5、单例模式一般作用

单例模式无状态(没有成员变量,一般以工具类的形式提供。