1.单例模式【Singleton  Pattern】:

设计模式:对问题行之有效的解决方式。其实它是一种思想,当人们在写代码的过程中,发现有些代码可提高效率,或者可复用,或者更灵活,在不断的实践中,提取出的一些代码,根据特点命名,就出现了设计模式。

1,单例设计模式。
    解决的问题:就是可以保证一个类在内存中的对象唯一性。

UMl单例图:

饿汉式:这个类被加载的时候,静态变量会被初始化,类的对象就存在了。一加载,就创建这个唯一的对象。

    class EagerSingle {/*** 饿汉式* 这个类被加载的时候,静态变量会被初始化,类的对象就存在了*/private static  final EagerSingle s = new EagerSingle();/*** 私有的默认的构造方法,避免外界通过构造方法new多个实例,* 构造方法是私有的,此类不能被继承*/private EagerSingle(){}/*** 静态工厂方法* @return*/public static synchronized  EagerSingle getInstance(){return s;}}

懒汉式:类加载的时候,没有对象,只有调用getInstace()方法,对象才会被创建

class LazySingle{private static  LazySingle s1 = null;//私有的构造方法private LazySingle(){}/*** 加synchronized:* 原因:* 多个线程并发操作共享数据s1,因为有多条语句操作共享数据,会出现线程安全问题。* 可能创建多个对象,存在线程安全的问题,则用同步锁,* 在方法上加同步锁,或者加同步代码块,该类所属的类字节码锁* @return*/public static synchronized LazySingle getInstance(){synchronized (LazySingle.class) {if(s1 != null){//--A//--B//new 了不只一个对象s1 = new LazySingle();}}return s1;}}

public class Single{public static void main(String[] args) {// TODO Auto-generated method stubLazySingle ls1 = LazySingle.getInstance();LazySingle ls2 = LazySingle.getInstance();System.out.println(ls1==ls2);        }}

输出结果为:true。说明引用ls1和ls2 指向同一个对象,地址相同,堆内存中只存在一个对象。

单例设计模式的小应用:

class Test{private int num;private  static final Test t = new Test();private Test(){}public static synchronized Test getInstance(){return t;}public int getNum(){return num;}public void setNum(int num){this.num = num;}}public class Single{public static void main(String[] args) {                   Test t1 = Test.getInstance();Test t2 = Test.getInstance();t1.setNum(10);t2.setNum(20);System.out.println(t1.getNum());System.out.println(t2.getNum());}}

输出结果是:20,20。而不是10,20,因为t1和t2指向同一个对象,t2.setNum(20)后面执行,对象的值被修改为20,所以都输出20.

2.单例模式的实现过程:

1.定义一个这个A类类型的静态变量 a,private static A a = null;

2.private + 类名的构造函数,必须是私有的,是保证这个类不能被其它类new出来。

Private A{}

3.对外提供一个一个public static A getInstance()的方法,其它类只能通过这个方法来得到这个类A的实例

4.通过new在本类中,将创建的对象返回

3. 加同步和不加同步的比较

方法二比方法一更加通用,更加完美,为什么呢?

因为方法一存在风险,方法一是线程不安全的,在一个B/S项目中,每个HTTP Request请求到J2EE的容器后就创建了一个线程,每个线程创建一个单例对象怎么办?假设这时候我们用方法一,大家看黄色部分,假如这会儿有两个线程A,B, 线程A执行到This.a = new A();在堆上正在申请内存空间,可能需要0.001微秒,就在这0.001微秒之内,线程B执行到 If (a == null),你说这个判断条件是true还是false呢?是true,因为线程A在堆上正在分配内存空间,还没有创建出实例来。那么,线程B也往下走,内存中就有两个a实例了,看看是不是出问题了?如果你这个单例是去拿一个序列号或者创建一个信号资源的时候,会怎么样?业务逻辑混乱!

数据一致性校验失败!最重要的是你从代码上还看不出什么问题,这才是最要命的!因为这种情况基本上你是重现不了的,不寒而栗吧,那怎么修改?用方法二,方法而通过final和synchronized 两个关键字解决了以上假设的问题!synchronized 用来解决线程不安全的问题。

4. 单例模式的优缺点:

优点:

1.减少了内存的开支,特别是一个对象需要频繁的创建、销毁时,而且创建和销毁的性能又无法优化,单利模式的优势就非常明显。

2.减少了系统的性能开销,当一个对象的产生需要比较多的资源的时候,如读取配置、产生其它依赖对象时,则可以在应用启动时直接产生一个单例对象,然后永久驻留在内存的方式来解决(在java EE采用单例模式时需要注意JVM垃圾回收机制)

缺点:1..单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。

2.单例模式对测试是不利的。

5. 最佳实践:

单例模式应用非常广泛,如在Spring中,每个Bean默认就是单例singleton的,这样做的优点是Spring容器可以管理这些bean的生命周期,决定什么时候创建出来,什么时候销毁,销毁的时候如何处理,如果采用非单例模式(Prototype),则bean初始化的管理交由J2EE容器,Spring容器不在跟踪管理Bean的生命周期。(自己也在学Spring中用过)

 

更全面的参考文章:https://coolshell.cn/articles/265.html

设计模式(一)-单例模式相关推荐

  1. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  2. C#设计模式(1)——单例模式

    原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...

  3. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

  4. java单例模式的七种写法_Java设计模式之单例模式的七种写法

    什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...

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

    在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...

  6. 一篇博客读懂设计模式之---单例模式

    一篇博客读懂设计模式之---单例模式 一.  单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...

  7. Java 设计模式(3)单例模式

    前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自 ...

  8. socket可以写成单例嘛_精读设计模式 Singleton 单例模式

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  9. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  10. 实践GoF的设计模式:单例模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:单例模式>,作者: 元闰子. 简述 GoF 对单例模式(Singleton)的定义如下: Ensure a class onl ...

最新文章

  1. Dynamic Network Surgery for Efficient DNNs
  2. PHP使用GD库封装验证码类
  3. 结合使用位置实参和任意数量实参
  4. ftp协议分析(一)
  5. Netrunner 2019.04 Rolling 版本发布
  6. nginx学习之详细安装篇(二)
  7. imToken 测评通关攻略
  8. 实时视频流(url)——延时显示
  9. 字符串统计,一个中文算2个字符,一个英文算一个字符
  10. 微信小程序——云开发入门
  11. 科赫雪花java_java递归实现科赫雪花
  12. 遥感影像几何校正方法
  13. 【HTML基础习题】HTML5+CSS3做问卷星登录页面
  14. Axure RP10——值得信赖的强大的原型制作工具,无需编写代码即可创造无限可能
  15. HDOJ 2856 How far away ?
  16. 三国杀全武将台词大全(标准+神话再临+一将成名12345+SP+国战+其他+皮肤,更新中)
  17. html excel2007打开很慢,excel打开很慢,教您Excel表格打开后很卡很慢怎么办
  18. IE8跳转谷歌浏览器亲测有效
  19. 2011年10月14日22:40,“你在哪(where are you)”诞生
  20. Wish封店的原因有哪些?

热门文章

  1. 微软开发x86模拟器,让Windows for ARM能运行x86应用
  2. 统计学习方法笔记 -- 概论
  3. UVa 1339,紫书P73,词频
  4. (.DS_Store)避免多人提交代码到GitHub上起冲突
  5. 数据库查询构建控件集Active Query Builder
  6. Android系统默认Home应用程序(Launcher)的启动过程源代码分析(3)
  7. 深入浅出ShellExecute
  8. opencv图像特征检测之斑点检测
  9. TokuDB · 引擎特性 · HybridDB for MySQL高压缩引擎TokuDB 揭秘
  10. 被spring和hibernate4逼疯