Java正确实现一个单例设计模式的示例

 更新时间:2019年01月09日 09:51:48   作者:李灿辉  
今天小编就为大家分享一篇关于Java正确实现一个单例设计模式的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

设计模式中的单例,是最常用,也算是比较简单的一个了。我们都知道,要想保证只有一个实例,通常采用加锁和双重检查的方式来实现单例,代码如下。

public class SingletonTest {
  private SingletonTest(){
  }
  private static SingletonTest instance;
  public static SingletonTest getInstance(){
    if(instance == null){
      synchronized (SingletonTest.class){
        if(instance == null){
          instance = new SingletonTest();
        }
      }
    }
    return instance;
  }
}

这种写法的要点主要有如下几个,1,私有构造函数,即不允许直接调用构造函数new一个对象。2,静态实例。3,静态获取示例的方法。首先判断instance是否为null,然后加锁,然后再判断instance是否为null,之后进行初始化。最后返回示例。

做到这些就足够了吗?并不是。

我们都知道,jvm的内存模型,jvm中的线程有自己的工作内存,jvm有主内存,工作内存是主内存的拷贝,工作内存和主内存直接并不是实时一致的。一个线程创建了单例对象后,别的线程并不一定可以立刻感知到。所以,以上代码中,instance还需要用volatile来修饰,才能真正做到单例模式。修改后的代码如下。

public class SingletonTest {
  private SingletonTest(){
  }
  private static volatile SingletonTest instance;
  public static SingletonTest getInstance(){
    if(instance == null){
      synchronized (SingletonTest.class){
        if(instance == null){
          instance = new SingletonTest();
        }
      }
    }
    return instance;
  }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • datax-web在windows环境idea中模块化打包部署操作步骤

    datax-web在windows环境idea中模块化打包部署操作步骤

    这篇文章主要介绍了datax-web在windows环境idea中模块化打包部署操作步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • Mybatis把返回结果封装成map类型的实现

    Mybatis把返回结果封装成map类型的实现

    本文主要介绍了Mybatis把返回结果封装成map类型的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Java中volatile关键字实现原理

    Java中volatile关键字实现原理

    本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,对Java中volatile关键字实现原理感兴趣的朋友一起通过本文学习吧
    2017-06-06
  • java 中设计模式(值对象)的实例详解

    java 中设计模式(值对象)的实例详解

    这篇文章主要介绍了java 中设计模式(值对象)的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • Java Scala数据类型与变量常量及类和对象超详细讲解

    Java Scala数据类型与变量常量及类和对象超详细讲解

    本文内容主要分为3节,依次讲解:Scala的数据类型有哪些? 变量常量如何使用? 类和对象如何理解? 受限于博主的大脑容量,大概是无法做到事无巨细的,不过其实也没必要那么"细",抓住主要脉络,加上大量的练习,融会贯通只不过是时间的问题
    2022-12-12
  • Spring JPA联表查询之OneToOne源码详解

    Spring JPA联表查询之OneToOne源码详解

    这篇文章主要为大家介绍了Spring JPA联表查询之OneToOne源码详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • SpringBoot中的@RequestMapping注解的用法示例

    SpringBoot中的@RequestMapping注解的用法示例

    @RequestMapping注解是SpringBoot中最常用的注解之一,它可以帮助开发者定义和处理HTTP请求,本篇文章我们将详细为大家介绍如何使用SpringBoot中的@RequestMapping注解,感兴趣的同学跟着小编一起来学习吧
    2023-06-06
  • idea创建SpringBoot自动创建Lombok无效果的问题解决方案

    idea创建SpringBoot自动创建Lombok无效果的问题解决方案

    这篇文章主要介绍了idea创建SpringBoot自动创建Lombok无效果的问题解决方案,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • 关于@JSONField和@JsonFormat的使用区别说明

    关于@JSONField和@JsonFormat的使用区别说明

    这篇文章主要介绍了关于@JSONField 和 @JsonFormat的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 关于最长递增子序列问题概述

    关于最长递增子序列问题概述

    本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效地找到最长递增子序列,动态规划+状态压缩则通过状态压缩将空间复杂度优化至O(n)
    2025-02-02

最新评论