创建模式之单例模式

       在面试时经常会有人问单例模式,单例模式是在整个系统运行中仅且仅有一个实例,在被调用。我们熟知的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)的更多相关文章

  1. 设计模式01 创建型模式 - 单例模式(Singleton Pattern)

    参考 [1] 设计模式之:创建型设计模式(6种) | 博客园 [2] 单例模式的八种写法比较 | 博客园 单例模式(Singleton  Pattern) 确保一个类有且仅有一个实例,并且为客户提供一 ...

  2. Python设计模式 - 创建型 - 单例模式(Singleton) - 十种

    对于很多开发人员来说,单例模式算是比较简单常用.也是最早接触的设计模式了,仔细研究起来单例模式似乎又不像看起来那么简单.我们知道单例模式适用于提供全局唯一访问点,频繁需要创建及销毁对象等场合,的确方便 ...

  3. 【创建模式】--Singleton

    设计模式之Singleton(单态) 单态定义: Singleton 模式主要作用是保证在Java应用程序中,一个类Class 只有一个实例存在. 在很多操作中,比如建立目录  数据库链接都需要这样的 ...

  4. JavaScript基础对象创建模式之单体/单例模式(Singleton)

    首先,单例模式是对象的创建模式之一,此外还包括工厂模式.单例模式的三个特点: 1,该类只有一个实例 2,该类自行创建该实例(在该类内部创建自身的实例对象) 3,向整个系统公开这个实例接口 Java中大 ...

  5. 6、单例模式 Singleton模式 只有一个实例 创建型模式

    1.了解Singleton模式 程序在运行时,通常都会生成很多实例.例如,表示字符串的java . lang . string类的实例与字符串是- -对- -的关系,所以当有1000个字符串的时候,会 ...

  6. JAVA:将反射技术应用于工厂模式(Factory)和单例模式(Singleton)的简单代码

    反射技术大量用于Java设计模式和框架技术,最常见的设计模式就是工厂模式(Factory)和单例模式(Singleton). 参考URL: http://blog.csdn.net/xiaohai79 ...

  7. 第一式、单例模式-Singleton模式(创建型)

    一.简介 单例模式主要用的作用是用于保证程序运行中某个类只有一个实例,并提供一个全局入口点.单例模式(Singleton)为GOF阐述的标准24种设计模式中最简单的一个.但随着时间推移,GOF所阐述的 ...

  8. 设计模式之单例模式Singleton(三创建型)

    1.什么事单例模式? 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须 ...

  9. 《JAVA设计模式》之单例模式(Singleton)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述单例模式的: 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的 ...

随机推荐

  1. react中的数据请求

    在react中,没有提供专门的请求数据的模块,所以我们可以采用第三方请求数据的模块进行数据请求,常见的有axios和fetch-jsonp,下面来总结这两种方式的用法. axios 查看文档 http ...

  2. [ZZ]39条更好的软件开发方法

    1.重构是程序员的主力技能. 2.工作日志能提升脑容量. 3.先用profiler调查,才有脸谈优化. 4.注释贵精不贵多.杜绝大姨妈般的“例注”.漫山遍野的碎碎念注释,实际就是背景噪音. 5.普通程 ...

  3. Zabbix 更改监控项的应用级

  4. google chrome浏览器 程序无法启动并行配置不正确

    启动电脑后打开chrome弹出如下信息: 系统:win7 进入chrome的安装路径 C:\Program Files (x86)\Google\Chrome\Application 两个版本文件夹, ...

  5. [UE4]世界坐标和相对坐标

    一.世界坐标:相对于整个世界的坐标 二.相对坐标是相对于组件父级的坐标.如下图: 1.Mesh组件和CameraPositionArrow组件的相对坐标是相对于Root组件的坐标 2.Cube组件的相 ...

  6. T-SQL 简单子查询

    1.使用变量的方式实现的查询 use StudentManageDB go declare @StuId int --查询张永利学号 select @StuId=StudentId from Stud ...

  7. 转:JavaScript Reference for Microsoft Dynamics CRM 2011 / 2013

    JavaScript Reference for Microsoft Dynamics CRM 2011 / 2013 98 Replies Here’s a quick reference guid ...

  8. prvReadAsyncOperation

    prvReadAsyncOperation privilege is the Read privilege for System Job Entity (Role Customizationtab). ...

  9. phpstudy远程连接mysql

    格局如图所示执行以下命令 mysql -u root -p mysql>use mysql; mysql>select 'host' from user where user='root' ...

  10. SP694 DISUBSTR - Distinct Substrings

    /* 统计每个节点的max和min, 然后求和即可 min = max[fa] + 1 */ #include<cstdio> #include<algorithm> #inc ...