创建模式--单例模式Singleton(JAVA)
创建模式之单例模式
在面试时经常会有人问单例模式,单例模式是在整个系统运行中仅且仅有一个实例,在被调用。我们熟知的Calendar就是这种,
Calendar.newInstance()获取实例。此时,构造器要设置为private,防止被new实例。连接池也是整个系统仅有一个,采用单例模式,但连接池中的每条连接却采用原型模式创建。
单例模式因被整个系统运行,因此不能存在可被修改的实例变量。另外SpringMvc中的Controller和Service都为单例模式。
而Struts中的Controller为原型模式。
1.单例模式-饿汉加载
饿汉模式:在系统创建,启动时创建对象。由于静态变量的声明在编译时已经明确,因此在系统装载时就已经产生。不牵涉线程安全问题。
public class SingletonModel { private static final SingletonModel singleton = new SingletonModel(); /**
* 私有化构造实例
*/
private SingletonModel(){
} public static SingletonModel newInstance(){
return singleton;
}
}
饿汉模式加载
采用静态代码段方式
private static SingletonModel singleton = null;
static{
singleton = new SingletonModel();
}
静态代码块
2.单例模式-懒汉加载
懒汉模式:在第一次被调用的时候创建。
public class SingletonModel { private static SingletonModel singleton = null; /**
* 私有化构造实例
*/
private SingletonModel(){
} public static SingletonModel newInstance(){
if(singleton == null){
singleton = new SingletonModel();
}
return singleton;
}
}
懒汉加载
2.1 因用newInstance的方式,不适合多线程,而如果给newInstance方法加 synchronized同步锁(如示例1),但是同步又牵扯到性能,如果每一个线程都先做这个操作,就没有必要。
2.2 给代码块添加同步锁(如示例2),这种情况又会牵扯一个问题,就是A线程判断instance为null时,B线程也判断出instance为null,此时A单线程处理,B在等待,A创建对象完后,同步锁释放,B因为已经进入instance为null的里面,因此也会创建对象。为此需要进行双验证,即双保险。(如示例3)
public static synchronized SingletonModel newInstance(){
示例1
public static SingletonModel newInstance(){
if(singleton == null){
synchronized(SingletonModel.class){
singleton = new SingletonModel();
}
}
return singleton;
}
示例2
public static SingletonModel newInstance(){
if(singleton == null){
synchronized(SingletonModel.class){
if(singleton == null){
singleton = new SingletonModel();
}
}
}
return singleton;
}
示例3
参考文摘:
( java设计模式学习系列之一:单例模式(Singleton))http://blog.csdn.net/qjyong/article/details/1721342
(五种方法实现Java的Singleton单例模式)http://www.cnblogs.com/pkufork/p/java_singleton.html
------------------------------------------------------------------------------------------------------------------------------
如有纰漏之处,还望指正。
---DennyZhao
创建模式--单例模式Singleton(JAVA)的更多相关文章
- 设计模式01 创建型模式 - 单例模式(Singleton Pattern)
参考 [1] 设计模式之:创建型设计模式(6种) | 博客园 [2] 单例模式的八种写法比较 | 博客园 单例模式(Singleton Pattern) 确保一个类有且仅有一个实例,并且为客户提供一 ...
- Python设计模式 - 创建型 - 单例模式(Singleton) - 十种
对于很多开发人员来说,单例模式算是比较简单常用.也是最早接触的设计模式了,仔细研究起来单例模式似乎又不像看起来那么简单.我们知道单例模式适用于提供全局唯一访问点,频繁需要创建及销毁对象等场合,的确方便 ...
- 【创建模式】--Singleton
设计模式之Singleton(单态) 单态定义: Singleton 模式主要作用是保证在Java应用程序中,一个类Class 只有一个实例存在. 在很多操作中,比如建立目录 数据库链接都需要这样的 ...
- JavaScript基础对象创建模式之单体/单例模式(Singleton)
首先,单例模式是对象的创建模式之一,此外还包括工厂模式.单例模式的三个特点: 1,该类只有一个实例 2,该类自行创建该实例(在该类内部创建自身的实例对象) 3,向整个系统公开这个实例接口 Java中大 ...
- 6、单例模式 Singleton模式 只有一个实例 创建型模式
1.了解Singleton模式 程序在运行时,通常都会生成很多实例.例如,表示字符串的java . lang . string类的实例与字符串是- -对- -的关系,所以当有1000个字符串的时候,会 ...
- JAVA:将反射技术应用于工厂模式(Factory)和单例模式(Singleton)的简单代码
反射技术大量用于Java设计模式和框架技术,最常见的设计模式就是工厂模式(Factory)和单例模式(Singleton). 参考URL: http://blog.csdn.net/xiaohai79 ...
- 第一式、单例模式-Singleton模式(创建型)
一.简介 单例模式主要用的作用是用于保证程序运行中某个类只有一个实例,并提供一个全局入口点.单例模式(Singleton)为GOF阐述的标准24种设计模式中最简单的一个.但随着时间推移,GOF所阐述的 ...
- 设计模式之单例模式Singleton(三创建型)
1.什么事单例模式? 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须 ...
- 《JAVA设计模式》之单例模式(Singleton)
在阎宏博士的<JAVA与模式>一书中开头是这样描述单例模式的: 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的 ...
随机推荐
- 廖雪峰Java3异常处理-1错误处理-2捕获异常
1捕获异常 1.1 finally语句保证有无错误都会执行 try{...}catch (){...}finally{...} 使用try...catch捕获异常 可能发生异常的语句放在try{... ...
- jquery load()函数和window.onload事件
我想用jquery load()一个饼状图页面, 但是load不出来 代码如下: 后来百度了一下,解决办法如下: window.onload事件只有在文档载入的时候才会执行的,你载入子页面不会触发这个 ...
- 跨域问题及jQuery中Ajax传参的讲解
1.跨域:不再同一服务器下,就是协议,域名,端口,有一个不一样: 浏览器对于javascript的同源策略的限制: 案例: 以 http://172.164.23:8088/ 为例 相同域名:172. ...
- 安卓权威编程指南 - 第五章学习笔记(两个Activity)
学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正. IntentActivityDemo学习笔记 ...
- STP RSTP
一.透明网桥 1.对于一般的透明网桥来说,通常都具有以下的特点: +拓展LAN的能力 +自主动态学习站点的地址信息 当网桥的某个端口上收到含有某个源MAC地址的数据帧时,它就把该MAC地址和接收该数据 ...
- android studio AIDL 编译时 错误:找不到符号
原贴路径:http://blog.csdn.net/baidu_30164869/article/details/51036405 PS:在android studio中 当将java文件放到aidl ...
- Android Studio启动后出现cannot bind to 127.0.0.1:5037 10048的解决办法
第一次:先连接测试手机,然后启动Android studio时出现下面的弹框,网上查找资料说是360手机助手导致的,但是发现没有安装360手机助手只有360,卸载360后再启动Android stud ...
- $.extend与$.fn.extend()
很多情况下,用户需要对jQuery插件进行二次开发,那么我们来看看JQ原开发者为我们提供的两种扩展插件的方式如下: 1.类别类:相当于为jquery扩展一个类,比如现在我要扩展一个简单的想加的功能函数 ...
- Spring IoC中各个注解的理解和使用
一.把在Spring的xml文件中配置bean改为Spring的注解来配置bean 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的 ...
- ZooKeeper系列(8):ZooKeeper伸缩性
一.ZooKeeper中Observer 1.1 ZooKeeper角色 经过前面的介绍,我想大家都已经知道了在ZooKeeper集群当中有两种角色Leader和Follower.Leader可以接受 ...