单例有两种:懒汉式和饿汉式

/**
* 懒汉式的单例模式
* 这种单例模式如果采用到多线程调用该方法,有可能会产生多个实例,原因是:
* 当线程一进入了①处,此时轮到线程二的时间片,线程二也来到①处,则两个线程各自会创建实例,这样就不满足单例模式的目标了
* 解决办法有三种:
* 1.将懒汉式转换成饿汉式,当类加载的时候就完成对该实例的创建,这样多线程操作的时候只会获取该实例而不会创建该实例,自然也不会产生多个实例了
* 2.在getInstance方法前加入synchronized关键字
* 3.“双重检查加锁”
* User: HYY
* Date: 13-11-15
* Time: 下午12:28
* To change this template use File | Settings | File Templates.
*/
public class LazySingleton {
private static LazySingleton mySingleton; private LazySingleton(){} public static LazySingleton getInstance() {
if(mySingleton==null) {
//①
mySingleton = new LazySingleton();
}
return mySingleton;
} public void businessMethod() {
System.out.println("业务方法");
} public static void main(String[] args) {
LazySingleton singleton = LazySingleton.getInstance();
singleton.businessMethod();
LazySingleton singleton2 = LazySingleton.getInstance();
System.out.println("1==2:"+(singleton==singleton2));
}
}

这种单例模式如果采用到多线程调用该方法,有可能会产生多个实例,原因是:
当线程一进入了①处,此时轮到线程二的时间片,线程二也来到①处,则两个线程各自会创建实例,这样就不满足单例模式的目标了
解决办法有三种:
* 1.将懒汉式转换成饿汉式,当类加载的时候就完成对该实例的创建,这样多线程操作的时候只会获取该实例而不会创建该实例,自然也不会产生多个实例了
* 2.在getInstance方法前加入synchronized关键字
* 3.“双重检查加锁”

/**
* 饿汉式单例模式
* 这种单例模式能够解决多线程创建多个实例对象的问题
* 采用了这种方式再也不用担心多线程对该对象的多次实例
* 当类被加载的时候就已经初始化该实例,如果该类是一个庞大的实例,常驻一大块内存,则这样不是一个好设计。应当在需要的时候再去实例该对象(懒汉式)
* User: HYY
* Date: 13-11-15
* Time: 下午12:38
* To change this template use File | Settings | File Templates.
*/
public class HungrySingleton {
private static HungrySingleton hungrySingleton = new HungrySingleton(); private HungrySingleton(){} public HungrySingleton getInstance() {
return hungrySingleton;
}
}
/**
* 在getInstance方法前面添加synchronized关键字解决多线程的问题。
*
* 如果有很多线程要获取这个单例,则这种设计方式比较低效。为什么?
* 要知道synchronized关键字有可能使程序的效率降低100倍。
* User: HYY
* Date: 13-11-15
* Time: 下午12:34
* To change this template use File | Settings | File Templates.
*/
public class SyncSingleton {
private static SyncSingleton syncSingleton; private SyncSingleton(){} public synchronized static SyncSingleton getInstance() {
if(syncSingleton==null) {
syncSingleton = new SyncSingleton();
}
return syncSingleton;
}
}
/**
* 我们其实只需要保证在创建的时候有只有一个线程负责该单例的创建即可。
* 因此我们采用“双重检查加锁”方式(即只加锁创建实例部分的代码)
*
* User: HYY
* Date: 13-11-15
* Time: 下午12:56
* To change this template use File | Settings | File Templates.
*/
public class DoubleCheckSingleton {
private volatile static DoubleCheckSingleton syncSingleton; private DoubleCheckSingleton(){} public static DoubleCheckSingleton getInstance() {
if(syncSingleton==null) {//如果还没有进行实例化
//①
synchronized (DoubleCheckSingleton.class) {//准备进入创建操作,在此之前先判断创建操作是否已经加锁
if(syncSingleton==null) {//再次判断是否已经加锁,如果没有这句判断,那么已经进入①处的线程还会进行实例化
syncSingleton = new DoubleCheckSingleton();
}
}
}
return syncSingleton;
}
}

设计模式之单例(singleton)设计模式代码详解的更多相关文章

  1. Java设计模式之 — 单例(Singleton)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8860649 写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上 ...

  2. 瞎扯设计模式1:单例模式 饿汉模式 懒汉模式 线程安全的单例 singleton 设计模式 java

    [原创声明]此文为本人原创,欢迎转载,转载请注明出处,作者链接~ http://www.cnblogs.com/m-yb/p/8833085.html 单例很常用,面试也经常被问,如:不用自定义锁怎么 ...

  3. JAVA设计模式之单例(singleton)

    一.饿汉式 /** * 饿汉式 */public class Singleton01 { private static final Singleton01 instance = new Singlet ...

  4. 详略。。设计模式1——单例。。。。studying

    设计模式1--单例 解决:保证了一个类在内存中仅仅能有一个对象. 怎么做才干保证这个对象是唯一的呢? 思路: 1.假设其它程序可以任意用new创建该类对象,那么就无法控制个数.因此,不让其它程序用ne ...

  5. 深入浅出单实例Singleton设计模式

    深入浅出单实例Singleton设计模式 陈皓 单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了.这个设计模式主要目的是想在整个系统 ...

  6. 设计模式——懒汉式单例类PK饿汉式单例类

    前言 我们都知道生活中好多小软件,有的支持多IP在线,有的仅仅局限于单个IP在线.为什么这样设计,在软件开发阶段就是,有需求就是发展.这就是软件开发的一个设计模式--懒汉式单例类和饿汉式单例类. 内容 ...

  7. 游戏设计模式——C++单例类

    前言: 本文将探讨单例类设计模式,单例类的懒汉模式/饿汉模式,单例类的多线程安全性,最后将利用C++模板减少单例类代码量. 本文假设有一个Manager管理类,并以此为探究单例类的设计模式. 懒汉模式 ...

  8. java软件设计模式只单例设计模式

    概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计 ...

  9. python 设计模式:单例模型

    一.单例模型简介 代码的设计模式共有25种,不同的应用场景应用不同的设计模式,从而达到简化代码.利于扩展.提高性能等目的.本文简述Python实现的单例模式场景.简而言之,单例模式的应用场景是一个类对 ...

  10. php设计模式之单例、多例设计模式

    单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量.如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化. 基于Singleton的特性,我们 ...

随机推荐

  1. Linq 的IQueryable和IEnumerable方式

    IEnumerable方式: public IEnumerable<WebManageUsers> GetWebManageUsers(ISpecification<WebManag ...

  2. tomcat启动正常,404. Eclipse没有正确部署工程项目

    http://blog.csdn.net/lynn_wgr/article/details/7751228 在eclipse中新建的Dynamic Web Project.写好代码后,选择Run on ...

  3. 计算Android屏幕解锁组合数

    晚饭时和同事聊到安卓屏幕解锁时会有多少种解锁方案,觉得很有趣,吃完饭开始想办法解题,花了大概2个小时解决.思路如下: 使用索引值0-9表示从左到右.从上到下的9个点,行.列号很容易从索引值得到: 使用 ...

  4. ITextSharp用来生成 PDF 的一个组件

    iTextSharp 是用来生成  PDF 的一个组件,在 1998 年夏天的时候,Bruno Lowagie ,iText 的创作者,参与了学校的一个项目,当时使用 HTML 来生成报告,但是,使用 ...

  5. 我也来学着写写WINDOWS服务-解析xml抓取数据并插入数据库

    项目告一段落,快到一年时间开发了两个系统,一个客户已经在试用,一个进入客户测试阶段,中间突然被项目经理(更喜欢叫他W工)分派一个每隔两小时用windows服务去抓取客户提供的外网xml,解析该xml, ...

  6. 《Think in Java》读书笔记一:对象

    一.抽象过程 Alan Kay曾经总结了第一个成功的面向对象语言.同时也是Java所基于的语言之一的SmallTalk的五个基本特性,这些特性表现了一种纯粹的面向对象程序设计方式: 1.万物皆为对象. ...

  7. oracle 定义临时表

    创建Oracle 临时表,可以有两种类型的临时表: 会话级的临时表 事务级的临时表 . 1) 会话级的临时表因为这这个临时表中的数据和你的当前会话有关系, 当你当前SESSION不退出的情况下,临时表 ...

  8. iOS多线程--NSOperation

    NSOperation是基于GCD的一套多线程实现方案,和GCD一样,线程的生命周期是由系统来自动管理的,不用像NSThread和Pthread一样让程序员手动管理.相对于GCD来说,它更加地面向对象 ...

  9. 使用Idea编写javaweb以及maven的综合(一)

    今天总结的第一点是在windows下使用idea编写jsp并且使用tomcat部署:第二点是新建maven项目,之前一直是听说也没有自己实践过,今天就大概说一下. 0x01 IDEA 全称 Intel ...

  10. 绑定本地Service并与之通信

    绑定Service需要调用 public boolean bindService (Intent service, ServiceConnection conn, int flags): 传入一个Se ...