【深入学习设计模式】——单例模式
来源:互联网 发布:淘宝鞋店推荐女鞋 编辑:程序博客网 时间:2024/05/29 10:24
前言
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,
在整个程序空间中,该类只存在一个实例对象。
其实,GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问法。
为什么需要使用单例模式:
在应用系统开发中,我们常常有以下需求:
- 在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象
- 在整个程序空间使用全局变量,共享资源
- 大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。
因为Singleton模式可以保证为一个类只生成唯一的实例对象,所以这些情况,Singleton模式就派上用场了。
单例模式实现
饿汉式
public class Person {public static final Person person = new Person();private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}//构造函数私有化private Person() {}//提供一个全局的静态方法public static Person getPerson() {return person;}}从上面的代码中我们可以看出来饿汉式是不会存在线程安全的,因为我们是new对象放在了最前面,但是这种做法会浪费资源。
懒汉式
public class Person2 {private String name;private static Person2 person;public String getName() {return name;}public void setName(String name) {this.name = name;}// 构造函数私有化private Person2() {}// 提供一个全局的静态方法public static Person2 getPerson() {if (person == null) {person = new Person2();}return person;}}
使用synchronized关键字解决并发问题
public static synchronized Person3 getPerson() {if(person == null) {person = new Person3();}return person;}这种方式虽然可以解决并发问题,但是在访问量大的时候会非常的影响性能,所以不太建议使用这种方式,因为我们只需要同步部分代码,并不是整个方法。
双重检查机制
public static Person4 getPerson() {if(person == null) {synchronized (Person4.class) {if(person == null) {person = new Person4();}}}return person;}这是比较好的方式,这种方式可能在第一次执行这段代码的时候会比较慢一些,因为使用了双重判断,但是当第一次初始化完成以后,后面的效率则会大大增加。
小结
单例模式是我们必须掌握的一个模式,在项目中用的非常多,尤其是后面的双重检查机制,需要我们好好的体会并发情况下的好处!
阅读全文
0 0
- 【深入学习设计模式】——单例模式
- 设计模式深入学习-单例模式
- 设计思想学习—单例模式
- 深入设计模式-1.单例模式
- 设计模式—单例设计模式
- 设计模式——单例模式(学习笔记)
- 设计模式学习笔记——单例模式
- 学习设计模式——单例模式
- JAVA设计模式学习7——单例模式
- 学习设计模式之禅——单例模式
- 设计模式学习(五)——单例模式
- 设计模式学习之——单例模式
- 设计模式学习笔记——单例模式
- 设计模式学习004——单例模式Singlton
- 学习设计模式——单例模式
- 单例模式——设计模式个人学习
- 设计模式学习——单例模式
- 设计模式学习笔记——单例模式
- <iframe>引用页面传值获取不到的问题
- FormData表单字段数据对象
- PHP 数组和字符串互相转换实现方法
- linux——文本处理——正则表达式
- 2的幂次方表示
- 【深入学习设计模式】——单例模式
- C++实现单例模式
- 比特币(BitCoin)学习第二天-比特币(BitCoin)是怎么被挖出来的?
- 浅谈CSS盒子模型
- Java Web 获取请求参数中文乱码问题
- ExpandableListView 删除group notifyDataSetChanged child重复
- day11 异常
- STL库——next_permutation用法
- Android热修复总结