Java设计模式之单例模式简析

 更新时间:2023年12月02日 09:13:20   作者:nuomizhende45  
这篇文章主要介绍了Java设计模式之单例模式简析,单例模式是常用的设计模式,在我们的系统乃至在框架中都普遍被用到,单例模式就是使一个类有且只有一个实例用于外部访问,这样大大的节省了系统的资源,需要的朋友可以参考下

什么是单例模式?

单例模式是常用的设计模式,在我们的系统乃至在框架中都普遍被用到,单例模式就是使一个类有且只有一个实例用于外部访问,这样大大的节省了系统的资源,而单例模式需要注意的也就以下三点:

  • 保证这个类有且只有一个实例
  • 自行创建这个实例
  • 提供这个实例供外部访问

代码实现需要注意的就是

  • 单例模式的类构造方法私有化
  • 这个类的定义中包含自己的一个静态实例对象
  • 提供一个共有静态方法供外部调用

三种实现方式

1、懒汉式

懒汉式与延迟初始化有些相似,就是没人用的时候我不实例化出来,有人需要调用了我再实例化出来,JAVA代码实现如下

public class SingletonClz{
    //实例
    private static SingletonClz instance = null; 
    //私有构造
    private SingletonClz(){}
    //外部调用方法
    public static getInstance()
    {
        if(null == instance)
        {
            instance = new SingletonClz(); 
            return instance;  
        }
        else
        {
            return instance;
        }
    }
}

2、饿汉式

先实例化出来,有人用就直接返回即可

public class SingletonClz{
    //实例
    private final static SingletonClz INSTANCE = new SingletonClz(); 
    //私有构造
    private SingletonClz(){}
    //外部调用方法
    public static getInstance()
    {
         return instance;
    }
}

3、加锁的单例模式

public class SingletonClz{
    //实例
    private static SingletonClz instance = null; 
    //私有构造
    private SingletonClz(){}
    //外部调用方法
    public static getInstance()
    {
        synchronized(SingletonClz.class)
        {
            if(null == instance)
            {
                instance = new SingletonClz();  
            }
        }
            return instance;
    }
}

这里加一个重量级的锁是为了防止并发的情况下两个线程同时访问这个方法同时发现instace为null,就都跑去实例化这个对象了。

加了一个synchronized锁就防止了这一情况的发生,当有一个线程拿到了锁,另一个就阻塞在外面知道锁的释放,当线程A实例化完成并释放锁后,B进来发现instace不等于空了,就不会再去实例化了。

到此这篇关于Java设计模式之单例模式简析的文章就介绍到这了,更多相关Java单例模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中StringBuilder字符串类型的操作方法及API整理

    Java中StringBuilder字符串类型的操作方法及API整理

    Java中的StringBuffer类继承于AbstractStringBuilder,用来创建非线程安全的字符串类型对象,下面即是对Java中StringBuilder字符串类型的操作方法及API整理
    2016-05-05
  • 详解Java比较器

    详解Java比较器

    这篇文章主要介绍了Java比较器的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Spring Security使用多种加密方式进行密码校验的代码示例

    Spring Security使用多种加密方式进行密码校验的代码示例

    在Web应用中,密码的安全存储和验证是至关重要的,本文将通过一个具体的代码示例,介绍和总结如何在Spring Security中使用多种加密方式进行密码校验,文中通过代码讲解得非常详细,需要的朋友可以参考下
    2024-06-06
  • Spring中如何动态注入Bean实例教程

    Spring中如何动态注入Bean实例教程

    这篇文章主要给大家介绍了关于Spring中如何动态注入Bean的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • Java修改eclipse中web项目的server部署路径问题

    Java修改eclipse中web项目的server部署路径问题

    这篇文章主要介绍了Java修改eclipse中web项目的server部署路径,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • SpringBoot整合mybatis/mybatis-plus实现数据持久化的操作

    SpringBoot整合mybatis/mybatis-plus实现数据持久化的操作

    这篇文章主要介绍了SpringBoot整合mybatis/mybatis-plus实现数据持久化,本节内容我们介绍了数据持久化的相关操作,并且是基础传统的关系型数据库——mysql,需要的朋友可以参考下
    2022-10-10
  • MyBatis入门介绍(超简单)

    MyBatis入门介绍(超简单)

    mybatis是Java的持久层框架, JAVA操作数据库是通过jdbc来操作的,而mybatis是对jdbc的封装。下文给大家介绍mybatis入门知识,感兴趣的朋友参考下吧
    2017-08-08
  • java进行error捕获和处理示例(java异常捕获)

    java进行error捕获和处理示例(java异常捕获)

    通常来说,大家都是对Java中的Exception进行捕获和进行相应的处理,有些人说,error就无法捕获了。其实,error也是可以捕获的。Error和Exception都是Throwable的子类。既然可以catch Throwable,那么error也是可以catch的
    2014-01-01
  • Spring在SingleTon模式下的线程安全详解

    Spring在SingleTon模式下的线程安全详解

    这篇文章主要介绍了Spring在SingleTon模式下的线程安全详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 详解Spring通过@Value注解注入属性的几种方式

    详解Spring通过@Value注解注入属性的几种方式

    本篇文章主要介绍了详解Spring通过@Value注解注入属性的几种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03

最新评论