深入理解单例模式的几种实现方式

 前言

单例模式是一种很常用的设计模式,其定义是单例对象的类只允许有一个实例存在。在使用spring自动创建对象时默认就是单例的。

使用场景

需要频繁的对对象进行创建与销毁,如果工具类对象

一、饿汉式(静态变量)

复制代码
public class Singleton1 {      private static final Singleton1 INSTANCE = new Singleton1();     //静态工厂    public static Singleton1 getInstance(){         return INSTANCE;     }  }
复制代码

饿汉式就是在类加载初始化的时候就创建了对象,尽管你还不需要使用他。相对来说我是比较喜欢这种方式的,既没有线程安全,速度也快,当然这是以牺牲空间换取速度,大家可以根据实际情况,根据该对象被创建的概率酌情使用该方法。

二、饿汉式(静态代码块

复制代码
public class Singleton2 {      private static Singleton2 instance = null;     //静态代码块    static {         instance = new Singleton2();     }      public Singleton2 getInstance(){         return instance;     }  }
复制代码

静态代码块实现的饿汉式与上述第一种方式类似,都是在类初始化的时候就创建对象,同样是线程安全的,其实就是JVM帮我们避免了线程安全,因为类只要加载一次,所以只会创建一个对象。

三、懒汉式(多线程下不可用)

复制代码
public class Singleton3 {      private static Singleton3 instance = null;      public static Singleton3 getInstance(){         if (null == instance){       //(1)             instance = new Singleton3();   //(2)         }         return instance;     }  }
复制代码

 这个懒汉式写法是线程不安全的,只能在单线程情况下使用。假设有两个线程A和B,线程A运行到(1)行代码时时间片已经完了,此时CPU切换执行线程B,线程B完成整个流程,也就是说这个时候instance已经不为空了,然后再执行线程A,此时线程A就会执行(2)行语句重新创建新的实例。

四、懒汉式(多线程下可用,但效率低)

复制代码
public class Singleton4 {      private static Singleton4 instance = null;      public static synchr
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信