定义:单例模式保证在整个软件系统内存中只存在一个类的实例,并且该类只有一个方法可以获取实例。属于创建型设计模式。

注意:必须将该类的构造方法私有化。

单例模式的七种写法:

饿汉式(静态常量):

/*** 使用静态常量的饿汉式单例模式demo*/
public class EagerSingletonDemo1 {private static final EagerSingletonDemo1 INSTANCE = new EagerSingletonDemo1();private EagerSingletonDemo1(){}public static EagerSingletonDemo1 getInstance(){return INSTANCE;}}
//优点:线程安全,简单。
//缺点:不属于懒加载,在装载该类时会立即初始化该变量,浪费内存。可以实际使用

饿汉式(静态常量加静态代码块):

/*** 使用静态常量的饿汉式单例模式demo,用静态代码块创建并初始化。*/
public class EagerSingletonDemo2 {private static final EagerSingletonDemo2 INSTANCE;private EagerSingletonDemo2(){}static {INSTANCE = new EagerSingletonDemo2();}public static EagerSingletonDemo2 getInstance(){return INSTANCE;}}//优点:线程安全,简单。
//缺点:不属于懒加载,在装载该类时会立即初始化该变量,浪费内存。可以实际使用

懒汉式(线程不安全):

/*** 懒汉式单例模式线程不安全*/
public class LazyLoadingSingletonDemo1 {private static LazyLoadingSingletonDemo1 INSTANCE;private LazyLoadingSingletonDemo1(){}public static LazyLoadingSingletonDemo1 getInstance(){if (INSTANCE == null){INSTANCE = new LazyLoadingSingletonDemo1();}return INSTANCE;}
}//该方式存在线程安全问题,在实际中绝不能使用。

懒汉式(线程安全)

/*** 懒汉式单例模式线程安全,方法级同步*/
public class LazyLoadingSingletonDemo1 {private static LazyLoadingSingletonDemo1 INSTANCE;private LazyLoadingSingletonDemo1(){}public static synchronized LazyLoadingSingletonDemo1 getInstance(){if (INSTANCE == null){INSTANCE = new LazyLoadingSingletonDemo1();}return INSTANCE;}
}//优点:线程安全,懒加载。
//缺点:每次调用该方法都要进行同步,性能差,不推荐使用。

双重检查懒汉式:

public class DoubleCheckLazyLoadingSingletonDemo {//该变量必须用volatile修饰,保证该变量线程可见,保证对单例的初始化立马被其他线程所知晓。private volatile static DoubleCheckLazyLoadingSingletonDemo instance;private DoubleCheckLazyLoadingSingletonDemo(){}public static DoubleCheckLazyLoadingSingletonDemo getInstance(){if (instance == null){synchronized (DoubleCheckLazyLoadingSingletonDemo.class){if (instance == null){instance = new DoubleCheckLazyLoadingSingletonDemo();}}}return instance;}
}
//懒加载,线程安全,只有第一批进去的线程要同步,剩下的不需要同步,性能也好。推荐使用。

使用静态内部类实现单例:

静态内部类的特点:

  1. 装载外部类时不会装载静态内部类。
  2. JVM保证类的装载过程线程安全。
  3. 只装载一次。
/*** 使用静态内部类实现单例模式demo。*/
public class StaticInnerClassSingletonDemo {private StaticInnerClassSingletonDemo(){}private static class InnerClass{private static final StaticInnerClassSingletonDemo instance = new StaticInnerClassSingletonDemo();}/*** 调用这个方法时会装载InnerClass类,初始化实例,并且线程安全,并且只会装载一次。* @return*/public static StaticInnerClassSingletonDemo getInstance(){return InnerClass.instance;}}
//优点:懒加载,线程安全。推荐使用。

使用枚举方式实现单例:

/*** 使用枚举方式实现单例。*/
public enum SingletonWithEnum {INSTANCE(1,2);private int a;private int b;private SingletonWithEnum(int a, int b) {this.a = a;this.b = b;}public void SumAB(){System.out.println(a+b);}
}//测试通过
public void testSingletonWithEnum(){SingletonWithEnum instance = SingletonWithEnum.INSTANCE;SingletonWithEnum instance2 = SingletonWithEnum.INSTANCE;System.out.println(instance == instance2);instance.SumAB();}//线程安全,并且可以防止反序列化创建新对象。

总结:

单例模式注意事项和细节说明:

  1. 单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
  2. 当想要实例化一个单例类的时候,必须要记住使用响应的获取对象的方法。而不是使用new。
  3. 单例模式的使用场景:需要频繁进行创建和销毁的对象,创建对象耗时耗资源过多,但又经常使用(数据源,工厂等)。

设计模式之单例模式介绍相关推荐

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

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

  2. 创建型设计模式 之 单例模式

    <研磨设计模式>中的定义:保证一个类仅有一个实例,并提供它的一个全局访问点. 而单例模式的本质便是--控制实例数目. 一.介绍 1.单例模式和静态方法区别 简单的一个懒汉式单例模式 pub ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. [设计模式] - Singleton单例模式

    一.介绍 单例模式是保证一个类仅有一个实例,并提供一个访问它的全局访问点. 在下面的情况下可以使用Singleton模式: 1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时: 2.当这 ...

最新文章

  1. filter与servlet的比较
  2. JavaScript 爆红后,微软为何还要开发 TypeScript?
  3. visual studio 阅读 linux-kernel
  4. Xilinx IP核之FIFO
  5. 2013年3月编程语言排行榜:有毒的Java
  6. 使用NSOperation为你的app加速
  7. android 音乐资源获取失败,android – 获取嵌入式mp3文件嵌入式艺术失败
  8. Django讲课笔记11:视图函数的请求和响应
  9. 我又来学ElasticSearch了。。。
  10. mongodb 学习笔记 04 -- 游标、索引
  11. gamma分布_深度学习需要掌握的 13 个概率分布(含代码)
  12. 尔雅网络选课 大学计算机知识,2017-2018学年第1学期超星尔雅网络课程选课指南.PDF...
  13. 证券市场的法律法规体系
  14. STM32 使用基本定时器实现微秒us级延时
  15. 【Linux入门】一文看懂 Linux man 手册
  16. 片上总线Wishbone 学习(四)接口信号定义
  17. OS_PV操作_4.过独木桥问题
  18. IDEA 卡住半天,buid(编译)不动——解决办法(适用于maven和gradle)及定位思路...
  19. 修改IP地址和主机名
  20. 13.3断流_更新13.3.1后,用WiFi王者荣耀断流,时不时460.飞在天上的解决办法。

热门文章

  1. Java案例:Swing常用组件演示
  2. 大数据学习笔记30:搭建高可用Hadoop集群
  3. 向量的 加,减,乘 运算_2
  4. 在linux系统中如何查看cpu,Linux中如何查看CPU的信息
  5. 知道经纬度坐标怎么计算两点间距离_【我的时间拣屎】亚里士多德:地球是圆的,我计算了地球的圆周...
  6. 2017.3.27 生成魔咒 思考记录(有史以来最不容易)
  7. 组件启动顺序_风扇组件的检测代换
  8. php模板多图上传插件,PHP+jQuery+Ajax多图片上传插件
  9. python f.write 保存图片到路径_装逼篇 | 抖音超火的九宫格视频是如何生成的,Python 告诉你答案...
  10. 通过Keepalived实现Redis Failover自动故障切换功能