单例模式(Singleton Pattern):

在平时的开发中,可能会用到单例模式,许多java的笔试题中也会叫笔试者写出单例模式的那几种写法并且分析。那么下面就来轻轻地探讨一下,最简单的设计模式,即单例模式。

单例模式的解释:

GoF对单例模式的定义:保证一个类只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。说的意思就是一个类在整个程序中就只能有一个实例,并且这个类中要定义一些可以全局访问的属性、方法等。

单例模式的要点有三:

1、有且仅有一个实例。 2、自己创建自己的实例。 3、自己向整个应用程序提供这个实例。

单例模式的应用场景:

如窗口管理系统、打印缓冲池、文件系统它们都是原型的例子。

单例模式按实例化对象的时间先后可以大体分为两种类型,即饿汉式和懒汉式,接下来将列出5种单例模式的写法,并分析他们缺点。

第一种:饿汉式

/**
* 单例模式-饿汉式
*/
public class Singleton
{
// 在定义的时候就初始化_instance,
private static Singleton _instance = new Singleton(); // 够造函数必须是私有的,不能被外部直接调用。
private Singleton()
{
} // 暴露给外部,提供实例。
public static Singleton getInstance()
{
return _instance;
}
}

缺点:在加载类的时候就实例化了对象,比较浪费资源。

第二种:懒汉式

/**
* 单例模式-懒汉式(一)
*/
public class Singleton
{
private static Singleton _instance; // 够造函数必须是私有的,不能被外部直接调用。
private Singleton()
{
} // 暴露给外部,提供实例。
public static Singleton getInstance()
{
if (_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
}

缺点:多线程不安全。比如两个线程同时进入getInstance()发现instance为空,那么它们都会去执行new Singleton(),从而导致实例不止一个。

第三种:懒汉式 - 加锁两次判断

/**
* 单例模式-懒汉式(二)
*/
public class Singleton
{
private static Singleton _instance;
private static readonly object synchronized = new object();
// 够造函数必须是私有的,不能被外部直接调用。
private Singleton()
{
} // 暴露给外部,提供实例。
public static Singleton getInstance()
{
if (_instance == null)
{
lock (synchronized) //加锁防止多线程
{
if (_instance == null)
{
_instance = new Singleton();
}
}
}
return _instance;
}
}

缺点:对方法进行了同步,解决了多线程访问时的不安全性,但是每次调用getInstance()都会去判断锁的状态,比较耗时。

第四种:懒汉式 - 内部类

/**
* 单例模式-懒汉式(四)
*/
public class Singleton
{
// 够造函数必须是私有的,不能被外部直接调用。
private Singleton()
{
} // 暴露给外部,提供实例。
public static Singleton getInstance()
{
return SingletonHolder._instance;
} // 静态内部内,实现延时加载
private static class SingletonHolder
{
public static Singleton _instance = new Singleton();
}
}

优点:实现了延时加载,也就是说没有在类被加载时就去实例话对象。

下面是黑马老师讲的,懒汉式加锁解决多线程安全问题。

 public class Singleton
{
private static Singleton _instance;
private static readonly object syn = new object();
private Singleton() //构造函数设置private,不能被new,单例模式
{ }
public static Singleton CreateInstance()
{
if (_instance == null)
{
lock (syn) //加锁防止多线程
{
if (_instance == null)
{
_instance = new Singleton();
}
}
}
return _instance;
}
}

c# 单例模式(Single);单例模式的5种写法的更多相关文章

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

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

  2. java单例模式的几种写法比较

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

  3. Android设计模式之单例模式的七种写法

    一 单例模式介绍及它的使用场景 单例模式是应用最广的模式,也是我最先知道的一种设计模式.在深入了解单例模式之前.每当遇到如:getInstance()这样的创建实例的代码时,我都会把它当做一种单例模式 ...

  4. 单例模式的N种写法

    单例模式算是设计模式中最容易理解,也是最容易手写代码的模式了吧.但是其中的坑却不少,所以也常作为面试题来考.本文主要对几种单例写法的整理,并分析其优缺点.很多都是一些老生常谈的问题,但如果你不知道如何 ...

  5. Java:单例模式的七种写法(转载)

    第一种(懒汉,线程不安全): package Singleton; /** * @echo 2013-10-10 懒汉 线程不安全 */ public class Singleton1 { priva ...

  6. Java:单例模式的七种写法[转]

    第一种(懒汉,线程不安全):  1 public class Singleton {   2     private static Singleton instance;   3     privat ...

  7. 【JAVA学习】单例模式的七种写法

    尊重版权:http://cantellow.iteye.com/blog/838473 第一种(懒汉.线程不安全): Java代码   public class Singleton { private ...

  8. KandQ:单例模式的七种写法及其相关问题解析

    设计模式中的单例模式可以有7种写法,这7种写法有各自的优点和缺点: 代码示例(java)及其分析如下: 一.懒汉式 public class Singleton { private static Si ...

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

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

随机推荐

  1. MySQL获取Schema表名和字段信息

    MySQL获取Schema表名和字段信息 获取表名 select TABLE_NAME,TABLE_TYPE,ENGINE,TABLE_ROWS,TABLE_COMMENT,CREATE_TIME,U ...

  2. mockito模拟静态方法

    这里要用到使用powerMock 注意点: 1 @RunWith(PowerMockRunner.class) 2 PowerMockito.mockStatic(StaticTest.class); ...

  3. CI框架基本配置/教你学习CI框架codelgniter

    CI框架现在中国可以说还是不成熟,不像thinkphp那样有那么多的中文手册,在国内,很多国人英语都很烂,CI现在教程还是不多.大家心里都存在这严重想法 CI 框架现在中国可以说还是不成熟,不像thi ...

  4. CF 482A(Diverse Permutation-相邻距离不同数为k的1~n全排列构造)

    A. Diverse Permutation time limit per test 1 second memory limit per test 256 megabytes input standa ...

  5. Scrapy爬虫入门系列4抓取豆瓣Top250电影数据

    豆瓣有些电影页面需要登录才能查看. 目录 [隐藏]  1 创建工程 2 定义Item 3 编写爬虫(Spider) 4 存储数据 5 配置文件 6 艺搜参考 创建工程 scrapy startproj ...

  6. Google Careers 程序员必修课

    quote from : https://www.google.com/about/careers/students/guide-to-technical-development.html Techn ...

  7. c/c++基本数据类型大小

    各个类型的变量长度由编译器来决定(实际上与操作系统位数和编译器都有关)使用时可用sizeof()得到,当前主流编译器一般是32位或64位. 类型 32位 64位 char 1 1 short int ...

  8. SQL.Cookbook 读书笔记4 插入更新和删除

    第四章 插入更新和删除 4.1 插入数据 ,'PROGRA','NEW YOURK'); 4.2 从一个表向另一个表中复制 insert into dept_east(deptno,dname,loc ...

  9. uva 12730(期望经典)

    选自: http://blog.csdn.net/myhelperisme/article/details/39724515 用dp(n)表示有n个位置时的期望值,那么,对于一个刚进来的人来说,他有 ...

  10. PhotoSwipe异步动态加载图片

    在开发搜房家居M站的时候,搜房家居装修效果图相册展示效果需要用到PhotoSwipe插件来显示图片.特点:1. 家居提供的接口,每次只能获取一张图片2. 装修效果图的张数不限.3. 从PhotoSwi ...