单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。

  在JAVA中实现单例,必须了解JAVA内存机制,JAVA中实例对象存在于堆内存中,若要实现单例,必须满足两个条件:

  1.限制类实例化对象。即只能产生一个对象。

  2.保证外部能够获取这个对象,否则对象创建将毫无意义

  如要满足以上两个条件,可以将构造方法私有化,然后在类中提供一个静态方法获取类实例。代码如下

 1 public class SingleTon {
 2
 3     private static final SingleTon single = new SingleTon();
 4
 5     private SingleTon() {
 6
 7     }
 8
 9     /**
10      * 获取一个单例对象。
11      * @return 返回SingleTon对象。
12      */
13     public static SingleTon getInstance() {
14         return single;
15     }
16
17 }

  JVM加载SingleTon后,会对静态成员做默认初始化,此时new SingleTon()创建的对象会赋值给single,类只会被加载一次,即使多次调用getInstance方法,所返回的对象也不会改变。single字段在初始化的过程中,对象就创建了,所以以上案例的代码又称为饿汉式。从对象的生命周期来看,类一旦加载,对象会在堆中立即创建,会浪费内存空间,因此,又存在另外一种称为懒汉式的单例设计模式。代码如下:

  

 1 public class SingleTonLazy {
 2
 3     private static SingleTonLazy single = null;
 4
 5     private SingleTonLazy() {
 6
 7     }
 8
 9     /**
10      * 获取一个单例对象。
11      * @return 返回SingleTon对象。
12      */
13     public static SingleTonLazy getInstance() {
14
15         if (single == null) {
16             single = new SingleTonLazy();
17         }
18
19         return single;
20
21     }
22
23 }

  SingleTonLazy在被加载进方法区后,不会立即创建对象,而是直到getInstance方法被调用以后,对象才会被创建。这种方式可以节约内存空间,但是也存在着线程安全问题,当线程A执行到判断对象为null,此时线程B获得执行权,线程B判断对象为null,此时线程A重新获得执行权,创建对象,线程B恢复,继续创建对象。将代码修改如下,使用同步锁解决线程安全问题。

  

 1 public class SingleTonLazy {
 2
 3     private static SingleTonLazy single = null;
 4
 5     private final static Lock lock = new ReentrantLock();
 6
 7     private SingleTonLazy() {
 8
 9     }
10
11     /**
12      * 获取一个单例对象。
13      * @return 返回SingleTon对象。
14      */
15     public static SingleTonLazy getInstance() {
16
17         if (single != null) {
18             return single;
19         }
20
21         lock.lock();
22         if (single == null) {
23             single = new SingleTonLazy();
24         }
25         lock.unlock();
26
27         return single;
28
29     }
30 }

  总结:饿汉式与懒汉式各有优缺点,但是相对来说,占用内存空间比让cpu判断锁的开销要小,所以饿汉式更使用一些。

转载于:https://www.cnblogs.com/liushihu/p/8720677.html

JAVA设计模式之单例设计模式相关推荐

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

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

  2. java单例设计模式懒汉_Java设计模式之单例设计模式(懒汉、饿汉)

    [toc] Java设计模式之单例设计模式(懒汉.饿汉) 相信面试过的初中级Java开发的朋友可能都有遇到过单例设计模式的笔试题吧,如果之前没有背下来或者不理解,可以看看下面这篇文章,应该足够应付笔试 ...

  3. java软件设计模式只单例设计模式

    概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计 ...

  4. Java中的单例设计模式

    什么是单例设计模式 所谓单例设计模式,就是采取一定的方法保证整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法. 目的:使用着在main方法中就不可以自己创建实例对象 ...

  5. 设计模式之单例设计模式

    1 设计模式(Design pattern) 代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人 ...

  6. 23种设计模式:单例设计模式(饿汉式 VS 懒汉式)

    23种设计模式:单例设计模式(饿汉式 VS 懒汉式) 每博一文案 世事浮沉,有太多的责任需要我们担当,生活中总有些挫折和磨难,让我们觉得快要杠不住了. 但当我们咬牙坚持过那段难熬的时光后,发现并没有想 ...

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

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

  8. Java面试题:单例设计模式、适配器模式的不同方式

    QUESTION:单例设计模式.适配器模式的不同方式? ANSWER: 1.单例设计模式,适配器设计模式     单利设计模式:             在java中,单例模式是指为了保证类在内存中只 ...

  9. 26、Java 简单实现单例设计模式(饿汉式和懒汉式)

    文章目录 一.概念 二.饿汉式 三.懒汉式 一.概念 ✏️[Singleton Pattern]如果一个类被设计成单例设计模式,则在整个应用程序运行过程中,该类只能存在一个实例. 二.饿汉式 思考:如 ...

最新文章

  1. include,require,include_once,require_once区别
  2. Compute节点无法启动nova组件,错误信息:AMQP server on 127.0.0.1:5672 is unreachable
  3. linux 邮件客户端 n1,N1:下一代开源邮件客户端
  4. 加计18-3李元龙第一次作业
  5. LwIP 之三 操作系统隔离接口 sys_arch
  6. Redis cluster原理
  7. CRM的business partner和employee在后台的搜索
  8. 【代码笔记】Web-HTML-颜色
  9. 《java程序员全攻略:从小工到专家》连载一:外行人眼中的IT人
  10. VirtualBox没有64位选项,无法安装64位的解决方法(zhuan)
  11. 周莫凡python_机器学习 | 莫烦Python
  12. python pandas安装不了_python安装pandas问题!python pandas安装教程
  13. 转:越是聪明人,越懂得下笨功夫
  14. python实现千牛客服自动回复语_千牛客服自动回复话术
  15. 技能梳理7@stm32+OLED+flash掉电保存+按键
  16. jmap常用命令以及dump文件查看
  17. Android手机屏幕变化监听
  18. 2022跨考华中科技大学计算机学院学硕上岸经验分享
  19. Pytorch中DistributedSampler()中的随机因素
  20. Suzy找到实习了吗 | 字符串结束啦 今天学习kmp 题还没做!!!记得回来补!!!

热门文章

  1. cv2.error: OpenCV(4.5.2) : -1 : error: (-5:Bad argument) in function ‘rectangle‘
  2. LeetCode MySQL 550. 游戏玩法分析 IV
  3. LeetCode 1496. 判断路径是否相交(set)
  4. LeetCode 1456. 定长子串中元音的最大数目(滑动窗口)
  5. LeetCode 345. 反转字符串中的元音字母
  6. 程序员面试金典 - 面试题 17.25. 单词矩阵(Trie树+DFS回溯,hard)
  7. LeetCode 14. 最长公共前缀
  8. POJ 1936 字符匹配(水题)
  9. html5 职工入职后台管理系统_ChemCMS是一款基于GO+PHP+MYSQL+HTML5构建的化学内容管理系统
  10. 中文新闻分类 数据集_三亚试点用大数据推行垃圾分类:刷卡扔垃圾,分类有奖励|界面新闻...