[设计模式笔记]3.单例模式
单例类只能有一个实例
单例类必须自己创建自己的唯一实例
单例类必须提供给所有其他对象这个实例
单例类有私有的构造方法和本身的一个静态实例对象
单例类向外界提供一个可访问的静态方法,供外界获取它的静态实例。
目的:保证一个类有且仅返回这一个实例对象。
Public class SingleObject {Private static SingleObject instance = new SingleObject()Private SingleObject() {}
Private static SingleObject getInstance() {Return instance;
}
Public void showMsg() {System.out.println(“show message”);
}
}
解决:一个全局使用的类频繁地创建和销毁。
构造方法是私有的决定了外界无法调用构造方法创建实例,必须通过单例类提供的静态方法获取唯一的类静态实例。
单例模式的几种实现方式:
1. 懒汉式,线程不安全
Lazy初始化:是
多线程安全:否
严格来说不算单例模式。
Public static getInstance() {
if(instance == null) {instance = new SingleObject();
}
Return instance;
}
2. 懒汉式,线程安全
Lazy初始化:是
线程安全:是
优点:第一次调用才生成实例,避免浪费内容
缺点:必须加锁synchronized才能保证单例,加锁会影响效率
Public class SingleObject {Private static SingleObject instance;Private SingleObject() {}Public static synchronized SingleObject getInstance() {If(instance == null) {Instance = new SingleObject();
}
Return instance;
}
}
3. 饿汉式
Lazy初始化 否
线程安全 是
优点 没有加锁,提高效率
缺点 类加载时就生成实例,浪费内容
实质 基于classloder机制避免了多线程同步问题,产生类装载的情况不少,但大多是调用单例的getInstance方法,也存在其他例如调用其他静态方法的情况,这种情况下显然没达到lazyload的效果
Public class SingleObject {Private static SingleObject instance = new SingleObject()Private SingleObject() {}
Private static SingleObject getInstance() {Return instance;
}
Public void showMsg() {System.out.println(“show message”);
}
}
4. 双检锁
Lazy 初始化是
线程安全 是
锁代码块的好处,提高效率,过滤掉已经存在实例的对象
也不能锁this Synchronized(this), 因为静态方法在类加载时就产生,类对象还没生成。
Synchronized(SingleObject.class) = static synchronized void getInstance(){}Public class SingleObject {Private volatile static SingleObject instance = new SingleObject();Private SingleObject() {}Private static SingleObject getInstance() {if(instance == null) {synchronized (SingleObject.class) {if(instance == null) {instance = new SingleObject();
}
Return instance;
}
}
}
}
5. 登记式、静态内部类
Lazy初始化 是
线程安全 是
[设计模式笔记]3.单例模式相关推荐
- 【设计模式笔记】单例模式Singleton Pattern
单例模式是比较简单的一个模式,项目中也经常用得到. 实现细节 将类的构造方法设置为私有的(private),通过个公有的(public)的方法来获取类的实例. 代码示例 public class Si ...
- Java读书笔记(8)-单例模式
Java读书笔记(8)-单例模式 今天在阅读<Effective Java 2>第3条时,获知一种使用枚举enum实现单例模式的新方法,然而书上并没有就此展开深入说明,于是上网查阅了一些资 ...
- Java设计模式笔记——七个结构型模式
系列文章目录 第一章 Java设计模式笔记--七大设计原则 第二章 Java设计模式笔记--六个创建型模式 文章目录 系列文章目录 一.适配器模式 1.概念 2.类适配器 3.对象适配 4.缺省适配器 ...
- 软件设计师——设计模式笔记上
软件设计师--设计模式笔记上(创造型5种) 设计模式的主要目的 设计模式的原则 1.工厂方法模式(类模式) 意图 适用性 代码实现 2.抽象工厂模式(对象模式) 意图 适用性 代码实现 3.生成器模式 ...
- 设计模式之一:单例模式
设计模式之一:单例模式 目录介绍 1.单例模式介绍 2.单例模式定义 3.单例模式使用场景 4.单例模式的实现方式 4.1 懒汉式[线程不安全] 4.2 懒汉式[**synchronized 线程安全 ...
- golang atomic load 性能_设计模式之Golang单例模式
今天给大家讲下什么是单例模式,以及在Go语言中如何用正确的姿势实现它.其实单例模式是一种在平时开发中经常用到的软件设计模式.在设计模式结构中,其核心是只包含一个被称为单例的特殊类.通过单例模式可以确保 ...
- 单例设计模式 序列化破坏单例模式原理解析及解决方案?
单例设计模式 序列化破坏单例模式原理解析及解决方案? 序列化和反序列化 反射的破坏
- Java设计模式中的单例模式
有时候在实际项目的开发中,我们会碰到这样一种情况,该类只允许存在一个实例化的对象,不允许存在一个以上的实例化对象,我们将这种情况称为Java设计模式中的单例模式.设计单例模式主要采用了Java的pri ...
- 设计模式笔记——代理模式
设计模式笔记--代理模式 代理模式介绍 代理模式通常是介于请求方和提供方的一个中介系统,请求方是发送请求的一方,提供方是根据请求提供相应资源的一方 Web中的代理服务器就是一个例子,客户端向代理服务器 ...
最新文章
- mysql 给min值取别名_mysql基本命令
- Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 6 ----asp.net MVC+Extjs
- 在RHEL5下构建基于系统用户的Postfix邮件系统
- 线程中start()与run()的区别
- pandas 按字符串肚脐眼 读取数据_十分钟学习pandas! pandas常用操作总结!
- boost::fibers::fiber用法的测试程序
- Android eMMC 分区详解(转载)
- Libevent源码分析-----配置event_base
- MPEG文件中什么是GOP
- 实现深拷贝的常用方法
- 三星s9Android9内测申请链接,国行三星S9/S9+开启安卓9.0内测
- 利用html简单自我介绍案例
- 射影几何----齐次坐标下的三点共线和非齐次坐标下的三点共线是等价的
- 【复杂网络】网络科学导论学习笔记-第五章节点重要性与相似性
- Javaweb中上传图片,获取路径
- 义隆单片机学习笔记之(二) 指令系统
- 给Rstudio修改背景和字体等设置教程
- 实用电路:用MOS管模拟的可调功率电阻
- Codeforces1696 C. Fishingprince Plays With Array
- 魔兽mdx文件导出为Ogre Mesh的小进展
热门文章
- 纸板箱机器人制作比例图纸_造一个黄油机器人(Butter Robot)
- Coloring Dominoes
- 学计算机广东2B大学,2017年广东2B大学最新排名情况
- 台达伺服控制器接线图_台达驱控一体三轴伺服驱动器ASDA-M-R系列无骨线圈绕线机解决方案...
- getValue()方法 java_java.util.zip.CRC32.getValue()方法示例
- 大工19春《计算机原理》在线作业2,大工19春《计算机原理》在线作业2.pdf
- java编写创建数据库和表的程序
- Codeforces Round #377 (Div. 2) 732A B C D E F
- val, lazy, def
- 2015-4-20 BAV推广页面修改前后对比-安全网购