五、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角色,该模式中仅有的一个角色,该角色有一个返回唯一实例的 ...
随机推荐
- 重识linux-关于selinux
重识linux-关于selinux 1 selinux是一个内核模块,有美国国家安全局研发,主要在基因redhat分支的系统上实现,当初的设计是未了避免用户资源的误用, 而SELINUX使用的是MAC ...
- Flutter实例一--底部规则导航栏制作
先来看看制作效果: 前置知识--StatefulWidget StatefulWidget具有可变状态(state)的窗口组件(widget).使用时要根据变化状态,调整State值, 能够快速初始 ...
- 解决oracle导入未分配表空间的问题
select 'alter table ' || t.TABLE_NAME || ' allocate extent;' from user_tables t order by t.TABLE_NAM ...
- ASP.NET前台代码绑定后台变量方法总结
经常会碰到在前台代码中要使用(或绑定)后台代码中变量值的问题.一般有<%= str%>和<%# str %>两种方式,这里简单总结一下.如有错误或异议之处,敬请各位指教. 一方 ...
- ip黑白名单防火墙frdev的原理与实现
汤之盘铭曰 苟日新 日日新 又日新 康诰曰 作新民 诗曰 周虽旧邦 其命维新 是故 君子无所不用其极 ——礼记·大学 在上一篇文章<DDoS攻防战 (二) :CC攻击工具实现与防御理论>中 ...
- Spring Cloud (5)hystrix 服务熔断
1.pom文件 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId&g ...
- day02-数据库操作
一.数据库操作 1.1.创建数据库(增) CREATE DATABASE 也可以使用小写,(注意不要漏掉分号 ;) mysql> create database test; 或 mysql> ...
- sse 与 socket 摘录-推送常用技术
推送技术常用的集中实现的实现方式 01.短连接轮询 02.长轮询 03.iframe流: 04.WebSocket 05.Server-sent Events(sse)
- html:meta
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale= ...
- 尚硅谷springboot学习3-helloworld程序
1.环境准备 –jdk1.8:Spring Boot 推荐jdk1.7及以上:java version "1.8.0_112" –maven3.x:maven 3.3以上版本:Ap ...