五、Singleton 单例模式
单例模式(Singleton Pattern)
定义:确保某个类只有一个实例,并且自行实例化并向整个体系提供这个实例
需求:保证对象只创建一次
场景:线程池、缓存、日志对象、对话框等常被设计为单例。
Singleton 通过构造方法限定 private 避免类在外部被实例化,在同一个虚拟机范围内,Singleton 的实例只能通过 getInstance 访问。
事实上,通过 Java 的反射机制能够实例化构造函数为 private 的类,基本是上所有的单例都失效。

优点:减少了内存的消耗,重用。
单例通用代码01:(饿汉式)
public class Singleton {
private static final Singleton singleton = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return singleton;
}
public void say(){}
}
可能产生多个实例02:(懒汉式)
public class Singleton{
private static Singleton instance = null;
private Singleton(){
}
public static Singleton getInstance(){
if(instance == null){if(instance == null){
instance = new Singleton();
}
}
return instance;
}
}
在高并发的情况下,可能在 instance ==null 与 new Singleton 之间产生多例。
解决多例的问题:03(懒汉式)方法上加锁
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
public void say(){
//todo something
}
}
使用双检查锁:04(懒汉式)双检查,方法内加锁
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
synchronized (Singleton.class) {
if(instance==null) {
instance = new Singleton();
}
}
}
return instance;
}
public void say(){
//todo something
}
}
饿汉式的单例模式,不会出现线程安全的问题。
懒汉式本身是非线程安全的。
方法上加锁与方法内双检查加锁:方法上加锁,虽然线程安全,但是每次都要同步,会影响性能 99% 的情况下是不需要同步的。
方法内检查2次加锁,确保第一次调用的时候加锁,这样是线程安全的,避免了性能的损耗。
扩展:固定数量的单例
public class ExtSingleton {
//最大单例个数
private static int maxNumOfSingleton = 2;
//单例名称
private static ArrayList<String> nameList = new ArrayList<>();
//单例集合
private static ArrayList<ExtSingleton> singletons = new ArrayList<>();
private ExtSingleton(){}
private ExtSingleton(String name){
nameList.add(name);
}
static {
for(int i=0;i<maxNumOfSingleton;i++){
singletons.add(new ExtSingleton("singleton:"+i));
}
}
public static ExtSingleton getInstance(){
//todo 获取单例某个对象
return singletons.get(0);
}
}
五、Singleton 单例模式的更多相关文章
- Java中的五种单例模式实现方法
[代码] Java中的五种单例模式实现方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2 ...
- singleton单例模式
单例设计模式 单例设计模式概述 单例模式就是要确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供 优点: 在系统内存中只存在一个对象,因此可以解决系统资源,对于一些需要频繁 ...
- Singleton 单例模式 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 设计模式01: Singleton 单例模式(创建型模式)
Singleton 单例模式(创建型模式) 动机(Motivation)当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性.以及良好的效率.这应该是类设计者的责任,而不 ...
- Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序执行生命周期中,使用了单类模式的类仅仅能有一个实例对象存在。
...
- 五种方法实现Java的Singleton单例模式
面试的时候经常会问到Java的单例模式,这道题能很好的考察候选人对知识点的理解程度.单例模式要求在系统运行时,只存在唯一的一个实例对象. 下面我们来详细剖析一下其中的关键知识点,并介绍五种实现方法,以 ...
- 开发设计模式(五)单例模式(Singleton Pattern)
http://blog.sina.com.cn/s/blog_89d90b7c0101805m.html 单例模式:意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提 ...
- Java中的五种单例模式
Java模式之单例模式: 单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例. 特点: 1,一个类只能有一个实例 2 自己创建这个实例 3 整个系统都要使用这个实例 例: 在下面 ...
- 一天一个设计模式——(Singleton)单例模式(线程安全性)
一.模式说明 有时候,我们希望在应用程序中,仅生成某个类的一个实例,这时候需要用到单例模式. 二.模式类图 三.模式中的角色 Singleton角色,该模式中仅有的一个角色,该角色有一个返回唯一实例的 ...
随机推荐
- 8.2.优化SQL语句
8.2.优化SQL语句 数据库应用程序核心操作逻辑都是通过执行SQL语句来执行,不管是直接通过解释器还是通过后台API提交. 调优手册里面的这一节内容帮助各种各样MySQL程序加快速度.手册包括SQL ...
- 修改json文件
第三方库jq https://stedolan.github.io/jq/manual/ cat old_deploy.json \ | jq --arg cpu_limit $cpu_limit ' ...
- 解决在V2.0中子组件使用v-model接收来自父组件的值异常
当我们使用父组件向子组件传值,当子组件中是v-model使用该值时会报:[Vue warn]: Avoid mutating a prop directly since the value will ...
- 下载,和scp上传问题
下载,和scp上传问题 wget http://download.openx.org/openx-2.8.10.zip [默认当前目录] scp ldm@192.168.1.150:/var/www ...
- c#调用带输出参数的存储过程
sql server中编写一个存储过程: CREATE PROCEDURE ProGetPWD @username varchar(20), @password varchar(20) OUTPUT ...
- poi excel 合并单元格
结论:final CellRangeAddress cra = new CellRangeAddress(rowId, rowId + rowSkip, colId, colId + c ...
- leetcode1017
这道题目很巧妙,似乎是有些过于巧妙了,属于我未知领域的类型,把原作者的解决方案放这里.(看大家都在给差评,我也顺手给个差评吧--) 参考:https://leetcode.com/problems/c ...
- gulp 添加版本号 解决浏览器缓存问题
分别安装gulp-rev.gulp-rev-collerctor.gulp-asset-rev,安装了的略过 npm install gulp-rev --save-dev npm install g ...
- C语言中的__LINE__宏
在C语言中,有这么四个预定义的宏: 当前文件: __FILE__ 当前行号: __LINE__ 当前日期: __DATE__ 当前时间: __TIME__ 这4个宏在代码编译的时候,由编译器替换成实际 ...
- opencv给图片添加文字水印<转>
其中有一些改动为了文字大小等还有一些图片的尺寸,真正使用的时候可以把尺寸的屏蔽掉 头文件: //==================================================== ...