-------Success is getting what you want, happiness is wanting what you get.

java设计模式之单例模式(Singleton)

---应用场合:只需要一个对象就可以了,例如一个朝代一个皇帝。

---作用:保证某个应用程序中某个实例有且只有一个。共同使用一个,节省资源。

---类型:饿汉模式,懒汉模式。

一.饿汉模式(类加载的时候就会实例化,线程安全)

 package com.sun.singleton;

 //饿汉模式
public class Singleton { //将构造函数私有化,不允许外部直接调用创建对象
private Singleton(){ }
//内部创建类的唯一实例,用private static 修饰(加载类时实例化一次,之后无论调用几次用的都是这一个实例)
private static Singleton instance = new Singleton(); //提供一个外部用于获取实例的方法,用 public static 修饰
public static Singleton getInstance(){
return instance;
} }

二. 懒汉模式(比较懒,所以只有调用方法getInstance时候根据判断结果才会实例化,而且线程不安全)

线程不安全原因:如果是单线程那懒汉模式也没有问题,但如果是多线程且没有加锁处理就不行了。不如A,B两个线程,A线程首先调用getInstance方法,判断instance 为空,即将创建实例,就在这时cpu切换到B线程,A暂停。B线程调用getInstance方法判断instance为空,然后创建实例,创建结束后B线程结束,A线程开始继续执行,注意:此时A线程已经判断过instance为空,那么会继续创建实例,这样线程AB都各自创建了实例,就不再是单例模式。------所以懒汉模式要加锁同步。

package com.sun.singleton;
//懒汉模式(线程不安全)
public class Singleton2 { //1.构造函数私有化,不允许外部直接调用
private Singleton2(){ } //2.只是声明类的唯一实例,这时没有真正实例化,使用private static 修饰
private static Singleton2 instance; //3.提供获取实例的方法,用public static修饰
// (1).解决线程不安全-------加同步(每个线程每次获取实例都要判断下锁,效率比较低)
public static synchronized Singleton2 getInstance(){
if(instance == null){
return instance = new Singleton2();
}
return instance;
} //(2).解决线程不安全-----双重检查锁定(提高效率)
public static Singleton2 getInstance2(){
/*如果第一个线程获取到了单例的实例对象,后面的线程再获取实例的时候不需要进入同步代码块中了*/
if(instance == null){
synchronized (Singleton2.class) {
if(instance == null){
instance = new Singleton2();
}
}
}
return instance;
} }

输出:

package com.sun.singleton;

public class Main {

    public static void main(String[] args) {

        //实例化两次作比较测试
//饿汉式
Singleton s1= Singleton.getInstance();
Singleton s2= Singleton.getInstance();
if(s1==s2){
System.out.println("饿汉式是同一个实例");
}else{
System.out.println("饿汉式不是同一个实例");
}
//懒汉式
Singleton2 s3 = Singleton2.getInstance();
Singleton2 s4 = Singleton2.getInstance();
if(s3==s4){
System.out.println("懒汉式是同一个实例");
}else{
System.out.println("懒汉式不是同一个实例");
} } }

结果截图:

说明单例模式是同一个对象实例化是共享一个内存空间。

两者区别:

饿汉模式:类加载的时候比较慢(加载时候实例化),但是运行时候比较快,线程安全。

懒汉模式:类加载的时候比较快,但是运行时候比较慢(调用方法的时候实例化),线程不安全。

这是自己学习过程中的记录,方便自己回顾,好记性不如烂笔头。

作者:艺至

------------2015-11-20 16:42:51

java 设计模式之单例模式的更多相关文章

  1. 折腾Java设计模式之单例模式

    博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...

  2. Java设计模式之单例模式(七种写法)

    Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...

  3. Java 设计模式之单例模式(一)

    原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ...

  4. java设计模式1——单例模式

    java设计模式1--单例模式 1.单例模式介绍 1.1.核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 1.2.常见场景 1.3.单例模式的优点 1.4.常见的五种单例模式实现 ...

  5. java设计模式之单例模式你真的会了吗?(懒汉式篇)

    java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...

  6. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  7. java设计模式- (1)单例模式

    参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ...

  8. [转]JAVA设计模式之单例模式

    原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...

  9. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

随机推荐

  1. CGI,FastCGI,PHP-CGI与PHP-FPM(转)

    http://www.cnblogs.com/zl0372/articles/php_4.html CGI CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服 ...

  2. [原创]SSIS-执行包任务调用子包且子包读取父包变量

    背景:       有时候需要将一个个开发好的独立的ETL包串接起来形成一个独立而庞大的包,如:每家分公司都开发不同的ETL包,最后使用执行包任务来将这些分公司的包给串联起来形成一个独立而完整运行的E ...

  3. mysql常用命令大全 mysql常用命令总结

    原文地址:http://www.jbxue.com/db/12472.html 本文介绍下,mysql中常用的一些命令,包括创建与修改数据库.数据库中的表,mysql的权限管理命令grant.revo ...

  4. Busybox支持中文的解决办法

    转载:http://blog.csdn.net/wavemcu/article/details/7202908 ******************************************** ...

  5. YYCache 设计思路

    iOS 开发中总会用到各种缓存,最初我是用的一些开源的缓存库,但到总觉得缺少某些功能,或某些 API 设计的不够好用.YYCache (https://github.com/ibireme/YYCac ...

  6. 1.4.2 solr字段类型--(1.4.2.5)使用枚举字段

    1.4.2 solr字段类型 (1.4.2.1) 字段类型定义和字段类型属性. (1.4.2.2) solr附带的字段类型 (1.4.2.3) 使用货币和汇率 (1.4.2.4) 使用Dates(日期 ...

  7. BeginInvoke、ThreadPool、Task三类异步方法的区别和速度比较

      速度(最快为1) 返回值 多参数 等待在时限内完成 超时后结束 ThreadPool.UnsafeQueueUserWorkItem() 1 非原生支持1 非原生支持 非原生支持3 不支持 Thr ...

  8. 《Cortex-M0权威指南》之Cortex-M0技术综述

    转载请注明来源:cuixiaolei的技术博客 Cortex-M0 处理器简介 1. Cortex-M0 处理器基于冯诺依曼架构(单总线接口),使用32位精简指令集(RISC),该指令集被称为Thum ...

  9. 《MFC游戏开发》笔记三 游戏贴图与透明特效的实现

    本系列文章由七十一雾央编写,转载请注明出处. 313239 作者:七十一雾央 新浪微博:http://weibo.com/1689160943/profile?rightmod=1&wvr=5 ...

  10. 管理后台-第二部分:Custom sections in Umbraco 7 – Part 2 the views(翻译文档)

    在上一篇文章中我们讨论了怎样在我们Umbraco7.0版本中去添加一个新的自定义的应用程序(或部分)和如何去定义一个树.现在我将给你展示你改何如添加视图,来使你的内容可以做一些更有意义的事情. The ...