单例模式可是使用频率较高的了先上个图

单例模式分为两种一种是饿汉式一种是懒汉式 其中饿汉式是天生线程安全的
1 饿汉式:第一次引用就会创建一个实例,也只会有这一个实例 所以线程安全;但是缺点是没办法实现懒加载

2 懒汉式:在单线程中Singleton的静态属性instance中,只有instance为null的时候才创建一个实例,构造函数私有,确保每次都只创建一个,避免重复创建;缺点不能再多线程中使用,因为:当两个线程同时运行到判断instance是否为空的if语句,并且instance确实没有创建好时,那么两个线程都会创建一个实例

3 同步锁模式:在懒汉模式上加上了方法同步锁,在同一时刻只能有一个线程得到锁,所以在多线程下也能保证只有一个实例;缺点:每次通过getInstance方法得到singleton实例的时候都有一个试图去获取同步锁的过程。加锁很耗时。

4 双重加锁DCL:只有当instance为null时,需要获取同步锁,创建一次实例。当实例被创建,则无需试图加锁;缺点:用双重if判断,复杂,容易出错。

5
网友评论