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

/**
* 懒汉式的单例模式
* 这种单例模式如果采用到多线程调用该方法,有可能会产生多个实例,原因是:
* 当线程一进入了①处,此时轮到线程二的时间片,线程二也来到①处,则两个线程各自会创建实例,这样就不满足单例模式的目标了
* 解决办法有三种:
* 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. APUE(1)——UNIX基本概念

    1.OS——操作系统是管理硬件资源的软件,也称作内核.与此同时,操作系统还为其他程序提供一系列的服务,比如执行程序.打开文件.读文件等等. 2.Kernel——内核对外提供一系列的系统调用,而一些库又 ...

  2. JS实现跳转到页面任何地方

    要实现两个内容: 1.从A页面跳转到B页面任何地方 方法:用id对要跳转的地方进行标记. 首先,在A页面可以设一个链接 <a href = "b.html#pos" targ ...

  3. Unity3D NGUI学习(一)血条

    这次来讲讲Unity3D NGUI这个插件的学习,这个插件是收费的,不过去网上可以下载得很多可用版本.用来做用户的交互UI,学习起来比较简单 第一步,导入NGUI包 http://pan.baidu. ...

  4. SSIS结合BCP及SQL Server作业实现定时将数据导出打包实现数据同步

    首先这个流程要实现的功能大致是: 有两台服务器,一台是对外网开发的,一台是内网的.那么很明显数据交互都是外网服务器在做,而这个流程要做的就是要将外网上面的数据定时同步到内网中. 我们依对其中某张表的操 ...

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

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

  6. 仿主题广告轮播js

    function SlideShow(c) { var a = document.getElementById("slide"); var f = document.getElem ...

  7. objective-c内存管理中autorelease的作用

    //创建自动释放池 @autoreleasepool { //autorelease会将对象放入自动释放池中,并返回该对象本身 //当自动释放池销毁时,将自动调用对象的release方法 Person ...

  8. redis基本数据类型【3】-List类型

    列表类型采用双向链表实现的,借助列表类型redis还可以作为队列使用,一个列表类型key最多能容纳2^32-1个元素 1.向列表两端增加元素 #向左边增加元素,返回增加后列表的长度 lpush key ...

  9. angularjs开发遇到的坑

    1.用ng-model绑定的输入input标签不能序列化$("form").serialize();要在value赋值才行. 2.disabled 是不能被序列化提交的(这不属于n ...

  10. C++函数指针和指针函数

    本文参考http://www.prglab.com/cms/pages/c-tutorial/advanced-data/pointers.php http://blog.csdn.net/ameyu ...