Java设计模式之单例模式

  • 单例模式
    • 该对象在JVM内存中只存在一个实例。并对外提供一个函数获取该实例。
  • 单例模式的实现方式
    • 懒汉模式,饿汉模式(非线程安全),饿汉模式(线程安全),双重检验锁,静态内部类,枚举,容器类管理。
  • 懒汉式
    • /**

      * 单列模式-懒汉模式(非线程安全)

      */

      public class Singleton02 implements Serializable {

      private static Singleton02 singleton02;

      public static Singleton02 getInstance(){

      if(singleton02==null){

      singleton02= new Singleton02();

      }

      return singleton02;

      }

    • 懒汉式因为是调用时创建,并发情况下可能会被多个来源同时访问。因此是线程不安全的。

  • 饿汉式
    • /**

      * 单例模式—饿汉模式

      */

      public class Singleton01 {

      private static Singleton01 singleton01=new Singleton01();

      public static Singleton01 getInstance(){

      return singleton01;

      }

      }

    • 饿汉式启动就会创建该实例,所以是线程安全的。

  • 饿汉式与懒汉式区别
    • 饿汉模式:程序启动就会实例化对象。
    • 懒汉模式:该对象第一次被调用的时候实例化对象
  • 懒汉式(线程安全)
    • /**

      * 单例模式-懒汉模式(线程安全)

      */

      public class Singleton03 {

      private static Singleton03 singleton03;

      /**

      * 添加同步锁防止该函数同时被多处调用

    •  

      *

      * @return

      */

      public static synchronized Singleton03 getInstance(){

      if(singleton03==null){

      singleton03=new Singleton03();

      }

      return singleton03;

      }

      }

    • 每次访问该函数都需要获取锁,所以会影响效率。

  • 双重校验锁
    • /**

      * 单例模式-双重校验锁

      */

      public class Singleton04 {

      private static Singleton04 singleton04;

      public static Singleton04 getInstance(){

      //检查变量是否初始化,不获取锁

      if(singleton04==null){

      //获取锁

      synchronized(Singleton04.class){

      //第二次检查变量是否初始化

      if(singleton04==null){

      singleton04=new Singleton04();

      }

      }

      }

      return singleton04;

      }

      }

    • 第一个if是检查变量是否被初始化。如果被初始化,不获取锁,直接返回对象。 第二个if是在多线程情况下保证只会被第一个拿到锁的线程初始化。后面的线程直接返回对象

  • 静态内部类
    • /**

      * 单例模式之静态内部类

      */

      public class Singleton05 {

      private Singleton05 singleton05;

      private static Singleton05 getInstance(){

      return Singleton05s.singleton05;

      }

      public static class Singleton05s{

      private static Singleton05 singleton05=new Singleton05();

      }

      }

      静态内部类模式通过一个静态内部类来初始化对象,在创建该对象的时候调用内部类的静态变量来实现初始化对象。由于内部类是静态变量,所以也保证了线程的安全性。
      • -------------------------------------------------------------------------本文内容参考蚂蚁课堂精讲设计模式系列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值