欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

简介

看到标题可能有人会问什么是单例模式呢?

在程序设计过程中,会遇到这么一个问题:当设计好一个类之后,会发现可以在别的类中调用类的构造方法实例化一个对象。并且通过实例化对象调用类中的属性和方法。

那么问题来了,如果存在某个类,这个类对于程序来说只需要产生一个类的时候,并且需要强制要求此类只能产生一个对象应该怎么办?这个时候就可以用到单例设计模式。所谓单例设计就是构造方法私有化,在类中实例化对象,通过类的静态方法调用类中的属性和方法。

其中单例设计又分为两种:

1.饿汉式:在系统加载类的时候就会自动提供实例对象。

2.懒汉式:在第一次使用的时候进行实例处理。

饿汉式

饿汉式单例设计模式就是在系统加载类的时候就会自动提供实例对象

那么如何才能实现饿汉式单例设计呢?可以将对象设置成一个静态的属性,再通过一个静态方法来获得这个属性。因为同一个类中静态属性只能静态访问。

下面来看看具体例子:

public  class Singleton {

private static final Singleton SINGLETON  = new Singleton();

private Singleton() {

System.out.println("饿汉式单例设计构造方法");

}

public static Singleton getSingloten(){

return SINGLETON;

}

public void print(){

System.out.println("饿汉式单例设计");

}

}

这就是一个单例设计的例子。在类中静态实例化了一个对象,并且有一个静态方法可以获得此对象。当需要用到此类时,直接通过类名就可以调用静态方法得到对象。

懒汉式

懒汉式单例设计是在第一次使用的时候进行实例处理。和饿汉式设计的区别就在于懒汉式设计是在调用静态方法的时候才会产生实例化对象,而不是系统直接提供。下面来看看具体事例:

通过这种单例设计我们就能达到只能得到一个对象的目的,但是这种懒汉式单例设计还是存在一个问题。是什么呢?来看看这个例子。

当使用多线程的时候调用静态方法获得对象的时候,运行结果说明并不是只产生一个对象,而是产生了三个对象。

运行结果如下图所示:

通过分析发现,在多线程中访问静态方法时,线程是同时访问的,并且同时判断对象是否为空。三个线程同时得到对象为空的结果,所以产生了三个对象。那么怎么去解决呢?可以通过线程的同步操作来实现这个操作。

实现方法如下:

同步操作就是当有一个线程在操作的时候,其他的线程就等待,这样就避免了线程同时获得对象为空的结果。但是这样加同步操作好像也不太合适,因为需要做的就只是同步操作判断对象是否为空的部分,所以将整个方法设为同步操作有点过于草率。因此还可以这样优化一下:

public  static Singleton getSingloten(){

if (SINGLETON == null){

synchronized (Singleton.class) {

if (SINGLETON == null) {

SINGLETON = new  Singleton();

}

}

}

return SINGLETON;

}

来看看运行结果:

构造方法确实是只被调用了一次,这样也达到了单例设计只产生一个对象的目的。有了这样的设计,单例设计才算是完美。

END

主  编   |   张祯悦

责  编   |   陶兴池

 where2go 团队


   

微信号:算法与编程之美

长按识别二维码关注我们!

温馨提示:点击页面右下角“写留言”发表评论,期待您的参与!期待您的转发!

Java|深入研究Java单例设计模式相关推荐

  1. 对于java程序语言的单例设计模式讲解

    1.设计模式:解决某一类问题最行之有效的方法.(java中有23种通用设计模式) 单例设计模式:解决一个类在内存中只存在一个对象. 2.单例设计模式有两种方式: 1)饿汉式 先初始化对象.当类一进内存 ...

  2. java饿汉式有啥作用,Java面试 - 什么是单例设计模式,为什么要使用单例设计模式,如何实现单例设计模式(饿汉式和懒汉式)?...

    什么是单例设计模式? 单例设计模式就是一种控制实例化对象个数的设计模式. 为什么要使用单例设计模式? 使用单例设计模式可以节省内存空间,提高性能.因为很多情况下,有些类是不需要重复产生对象的.如果重复 ...

  3. 单例设计模式java,浅谈Java编程中的单例设计模式

    写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上线后还可以帮助你分析数据.但是Java原生带有的System.out.println()方法却很少在真正的项目开发中使用,甚至像f ...

  4. Java中设计模式之单例设计模式-1

    单例作用 1 节省内存 2 可以避免多种状态导致状态冲突 单例的创建步骤 1 私有化构造方法 2 私有化声明的属性 3 getInstance 4 方法需要静态 单例分类 1.懒汉式 2.饿汉式 两种 ...

  5. Java面试题 实现单例设计模式(懒汉、饿汉)

    懒汉: //懒汉,顾名思义比较懒,在用的时候才实例化 public class Singleton {//创建实例,注意,此时没有newprivate static volatile Singleto ...

  6. java实现一个单例设计模式_Java正确实现一个单例设计模式的示例

    Java正确实现一个单例设计模式的示例 发布于 2021-1-12| 复制链接 分享一篇关于关于Java正确实现一个单例设计模式的示例,小妖觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的 ...

  7. 高频面试题2:单例设计模式

    Singleton:在java中即指单例设计模式,某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式.jvm中的runtime类. 1,只能有一个实例(构造器私有化) 2,必须自行创建这个实 ...

  8. 什么是Singleton,单例设计模式

    Singleton  [ˈsɪŋɡltən] 单例模式 在java中是指单例设计模式. 单例设计模式: 单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例. 例如:例如 ...

  9. 笔记:Java中的单例设计模式

    之前接触过单例模式,当初不明白这样的设计用意,今天特地研究了下java中的单例设计模式的用处及用法. 单例模式:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.一个类 ...

最新文章

  1. C# AppDomain
  2. v-if和v-show
  3. android merge的作用,Android学习手记-merge
  4. 创建Sonarqube项目
  5. html下拉框选中第二个,html通过点击第一个select改变第二关select的内容
  6. mysql 64位 8.0.11_mysql8.0.11 在windows64安装 步骤
  7. android 双卡流量统计,android流量统计
  8. 避免Gson使用时将一些字符自动转换为Unicode转义字符
  9. 我正在参加年度博客之星评选,请大家访问活动页面,帮我投票打分
  10. mysql 关联数组_在PHP / MySQL查询中创建关联数组
  11. RS-485 接口电路--转载
  12. 蒙特卡洛光线追踪技术
  13. 八 Spring Security Oauth2 单点登录 第三方授权(QQ、微信登录)
  14. Intellij IDEA设置类的文件头注释(@Author)(一)
  15. pigeon主题如何将顶部图片扩大
  16. 笔记本加装固态硬盘,安装Ubuntu
  17. python中关系运算符惰性求值,lazy.js 惰性求值实现分析
  18. 最新版CameraX入门(拍照、存储展示、切换前后摄像头、手电筒、闪光灯、手势伸缩、双击放大缩小)
  19. win10家庭版桌面软件图标左下角箭头删除
  20. 彻底分清机器学习中的上采样、下采样、过采样、欠采样【总结】

热门文章

  1. 凹凸贴图简析(应景之作--写给美术朋友们的凹凸贴图白皮书)
  2. 苹果重视中国市场恶补“中国话”
  3. vue项目keepAlive保持页面状态(详情页返回列表页不刷新)
  4. 【转】How to check HBA host and its corresponding WWPN on RHEL 5, 6 or 7?
  5. MAC隐藏文件或文件夹命令
  6. 科普SLAM之位姿图优化建图
  7. Notes(v070802)R6本地邮箱模版设置
  8. 音频降噪算法 java_音频处理之去噪算法---基于pcm和g711的音频16000hz、8bit去噪声算法...
  9. geoserver新建数据源和发布图层
  10. 若秋叶静离枝淡对离别