设计模式之单例(singleton)设计模式代码详解
单例有两种:懒汉式和饿汉式
/**
* 懒汉式的单例模式
* 这种单例模式如果采用到多线程调用该方法,有可能会产生多个实例,原因是:
* 当线程一进入了①处,此时轮到线程二的时间片,线程二也来到①处,则两个线程各自会创建实例,这样就不满足单例模式的目标了
* 解决办法有三种:
* 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)设计模式代码详解的更多相关文章
- Java设计模式之 — 单例(Singleton)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8860649 写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上 ...
- 瞎扯设计模式1:单例模式 饿汉模式 懒汉模式 线程安全的单例 singleton 设计模式 java
[原创声明]此文为本人原创,欢迎转载,转载请注明出处,作者链接~ http://www.cnblogs.com/m-yb/p/8833085.html 单例很常用,面试也经常被问,如:不用自定义锁怎么 ...
- JAVA设计模式之单例(singleton)
一.饿汉式 /** * 饿汉式 */public class Singleton01 { private static final Singleton01 instance = new Singlet ...
- 详略。。设计模式1——单例。。。。studying
设计模式1--单例 解决:保证了一个类在内存中仅仅能有一个对象. 怎么做才干保证这个对象是唯一的呢? 思路: 1.假设其它程序可以任意用new创建该类对象,那么就无法控制个数.因此,不让其它程序用ne ...
- 深入浅出单实例Singleton设计模式
深入浅出单实例Singleton设计模式 陈皓 单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了.这个设计模式主要目的是想在整个系统 ...
- 设计模式——懒汉式单例类PK饿汉式单例类
前言 我们都知道生活中好多小软件,有的支持多IP在线,有的仅仅局限于单个IP在线.为什么这样设计,在软件开发阶段就是,有需求就是发展.这就是软件开发的一个设计模式--懒汉式单例类和饿汉式单例类. 内容 ...
- 游戏设计模式——C++单例类
前言: 本文将探讨单例类设计模式,单例类的懒汉模式/饿汉模式,单例类的多线程安全性,最后将利用C++模板减少单例类代码量. 本文假设有一个Manager管理类,并以此为探究单例类的设计模式. 懒汉模式 ...
- java软件设计模式只单例设计模式
概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计 ...
- python 设计模式:单例模型
一.单例模型简介 代码的设计模式共有25种,不同的应用场景应用不同的设计模式,从而达到简化代码.利于扩展.提高性能等目的.本文简述Python实现的单例模式场景.简而言之,单例模式的应用场景是一个类对 ...
- php设计模式之单例、多例设计模式
单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量.如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化. 基于Singleton的特性,我们 ...
随机推荐
- JavaScript跨域解决办法
在找到跨域解决办法之前,我们要先弄清楚一些基本概念 什么是跨域? 什么是“同源策略”? 跨文档消息通信 & 跨域请求数据 主域相同而子域不同 不同域名的跨域访问 什么是跨域? 简单地理解就是因 ...
- C++ notes for beginners
作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...
- linux下grep命令笔记
grep -i 不区分大小写 --color 添加颜色 alias grep=‘grep --color=auto’ -v 显示没有被模式匹配到的行 -o 只显示 ...
- modelsim仿真时让状态机波形显示状态的名字
在使用Verilog编写有限状态机等逻辑的时候,状态机的各个状态通常以参数表示(如IDLE等).当使用ModelSim仿真的时候,状态机变量在wave窗口中以二进制编码的形式显示,如下面所示,这种显示 ...
- I2C Verilog的实现(二)
1. 起始结束信号的判断 //--------------------------------------------- //start,stop condition judgement //---- ...
- 你不知道的javascript 上卷 读书笔记
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C# Callback 回调实用讲解 [原创]
这个是2011年写的一个技术贴,现在看可能有点过时了,有兴趣的朋友也可以看一下. 一. 描述 在开发winform程序时不会考虑页面刷新问题,只要控制好线程别导致假死就ok了,但是在开发web页面程序 ...
- 编码、解码Html代码
引用 Base64-80.js 文件 做网页的时候有时候需要把富文本框的html代码保存到数据库,那么就需要编码后保存到数据库.浏览器端或后台再解码作绑定 *编码:encode64(str) *解码: ...
- Opencv读取视频一闪而过情况分析
在参加一个软件比赛需要用opencv对视频的处理,也碰到了一些问题. 最常见的就是视频一闪而过了,在网上查了好久都没解决, 最后重装在配置环境变量时发现的. 现在我来终结一下估计是比较全的了. 先说明 ...
- 学会用Reflector调试我们的MVC框架代码
我们知道,现在能调试.net程序通常有两个,第一个是ILSpy,还是一个是Reflector,这两个小反编译软件算是我们研究底层代码中所拥有的一把 锋利小尖刀~~~,比如你看到的ILSpy这样的界面图 ...