单例模式的理解

一、什么是单例模式

  单例模式的作用是保证应用程序在任何时刻只存在一个单例对象,比如打印机,一旦开始打印了就不再接收其他打印任务,一直到当前任务结束,否则会出现打印出的东西里存在多个任务中的信息;

二、单例的特征

  [1] 单例只能有一个实例;

  [2] 单例只能自己实例化唯一实例;

  [3]单例必须向其他对象提供这一实例;

三、常见单例的模式

  [1]饿汉式:不管其他对象需不需要单例的唯一实例,我都先完成实例化,你要就拿不用就放那;

 1 package com.zyy.stop;
 2
 3 public class Zyyprotest {
 4
 5     public static void main(String[] args) {
 6         SingleTon1.getSingleTon();
 7     }
 8 }
 9
10 class SingleTon1 {
11
12     private SingleTon1 () {}
13
14     //不管需不需要,先创建再说
15     static SingleTon1 st1 = new SingleTon1();
16
17     public static SingleTon1 getSingleTon() {
18         return st1;
19     }
20 }

  [2]懒汉式:外部需要唯一实例,不存在才会去创建;

 1 package com.zyy.stop;
 2
 3 public class Zyyprotest {
 4
 5     public static void main(String[] args) {
 6         SingleTon2.getSingleTon();
 7     }
 8 }
 9
10 class SingleTon2 {
11
12     private SingleTon2 () {}
13
14
15     static SingleTon2 st2 = null;
16
17     public static SingleTon2 getSingleTon() {
18         //不存在才会去创建
19         if (st2 == null)
20             st2 = new SingleTon2();
21
22         return st2;
23     }
24 }

  [3] 登记式:创建过唯一实例后,将该实例登记到Map中,下次用的直接从Map中获取;

 1 package com.zyy.stop;
 2
 3 import java.util.Map;
 4
 5 import org.apache.commons.collections4.map.HashedMap;
 6
 7 public class Zyyprotest {
 8
 9     public static void main(String[] args) throws InstantiationException, IllegalAccessException,
10         ClassNotFoundException {
11         SingleTon3.getSingleTon("SingleTon3");
12     }
13 }
14
15 class SingleTon3 {
16
17     private static Map<String, SingleTon3> map = new HashedMap<String, SingleTon3>();
18
19     protected SingleTon3 () {}
20
21     public static SingleTon3 getSingleTon(String name) throws InstantiationException, IllegalAccessException,
22         ClassNotFoundException {
23
24         if (name == null)
25             name = SingleTon3.class.getName();
26
27         if (map.get(name) == null)
28             map.put(name, (SingleTon3)Class.forName(name).newInstance());
29
30         return map.get(name);
31     }
32 }

四、双重检查锁

   这里我们用懒汉式来介绍双重检查锁,

 1 class SingleTon2 {
 2
 3     private SingleTon2() {}
 4
 5     static SingleTon2 st2 = null;
 6
 7     public static SingleTon2 getInstaTon2 () {
 8         if (st2 == null)
 9             st2 = new SingleTon2();
10
11         return st2;
12     }
13 }

在getInstaTon2 ()方法中有一步判断是否为空的操作,比如现在有2个线程A与B,同时到达判断这一步,在这一瞬间实例并没有创建,所以他们都能通过判断去创建2个实例,这就与单例的唯一实例相违背了;

但是我们通过双重检查锁就可以规避这种极端的情况:

 1 class SingleTon2 {
 2
 3     private SingleTon2() {}
 4
 5     static SingleTon2 st2 = null;
 6
 7     public static SingleTon2 getInstaTon2 () {
 8         if (st2 == null) {
 9             synchronized (st2) {
10                 if (st2 == null)
11                     st2 = new SingleTon2();
12             }
13         }
14
15         return st2;
16     }
17 }
时间: 2024-11-09 00:29:46

单例模式的理解的相关文章

JAVA Static方法与单例模式的理解

近期用sonar測评代码质量的时候,发现一个问题,project中一些util类,曾经写的static方法都提示最好用单例的方式进行改正. 为此,我细致想了想,发现还是非常有道理的.这里谈谈我个人对static方法与单例模式的理解. 所谓单例模式,我不做过多解释,推荐java设计模式之禅这本书,好好理解一下. 这里我谈谈两种写法: 曾经一些公共的类,我不假思索,习惯依照例如以下写法去写: public class DateUtil { public final static String DAT

单例模式简单理解

单例模式 一般来说,一个类可以创建多个不同的对象,但是对于单例模式而言.这个单例类虽然也能创建"多个"对象,但是本质上来讲,这个对象其实就是一个. 单例模式的特点是:这个类只有一个对象,且这个对象是自己创建的,这个系统都要使用这个唯一的对象. 比如说,系统中的回收站,不管是哪个应用使用,都是一个回收站. 代码具体如下: public class MyDanLi { //1.私有化构造函数,在外面不能New来创建 private MyDanLi() { } //2.创建私有的静态的类的单

javascript单例模式的理解

阅读目录 理解单例模式 使用代理实现单例模式 理解惰性单例 编写通用的惰性单例 单例模式使用场景 回到顶部 理解单例模式 单例模式的含义是: 保证一个类只有一个实例,并提供一个访问它的全局访问点.实现的方法是:使用一个变量来标志当前是否已经为某个类创建过对象,如果创建了,则在下一次获取该类的实例时,直接返回之前创建的对象,否则就创建一个对象.这就确保了一个类只有一个实例对象. 比如如下代码是一个简单的单例模式代码实例: var Singleton = function(name){ this.n

单例模式(例子理解)+可变参函数

class Logger { public: /** *@brief 获取Logger实例 */ static Logger* Instance() { if (!ms_pInstance) ms_pInstance = new Logger; return ms_pInstance; } /** *@brief 销毁实例 */ static void Destory() { if (ms_pInstance) { delete ms_pInstance; ms_pInstance = null

单例模式深入理解

所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application, 不用application的话,你也可以使用也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. 1. 最简单的实现 首先,能够想到的最简单的实现是,把类的构造函数写成private的,从而保证别的类不能实例化此类,然后在类中提供一个静态的实例并能够返回给使用者.这样,使用者就可以通过这个引用使用到这个类的实例了. public class Single

静态成员函数与私有构造函数(对单例模式的理解)

问题:单例模式中,静态函数中实例化了类对象,私有构造函数得到执行.构造函数是非静态成员函数,难道静态函数中能调用非静态函数吗? class Singleton { public: static Singleton * getInstance(); private: Singleton(); ~Singleton(); static Singleton * m_sglton ;//(此处也可直接写为静态变量) }; Singleton* Singleton:: m_sglton = NULL; S

对于单例模式的理解

单例模式指的是一个类只会有一个实例,即是instance,java web中Servlet就是单实例多线程的,单实例运用场景很多,例如在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例,单例的好处:节省内存,不需要new出来那么多实例:配合线程同步:单例一般用于公共资源: 举个例子:网页点击量通常设置成单例模式,一个静态全局变量用来计数,单例模式用于控制这个全局变量的访问,用同步锁住计数器来计数: 单例模式主要有3个特点,:1.单例类确保自己只有一个实例(构

个人对单例模式的理解

问题:单例模式有什么用处? 有些对象我们只需要一个,比如说线程池,对话框,缓存,网站计数器,任务管理器,打印机,显卡等设备的驱动程序对象.这些对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生,比如程序的异常行为,资源使用过量或者是不一致的结果等等. 解决方法:使用单例模式: 单例模式:确保一个类只有一个实例,并提供一个全局的访问点: 单例模式分类: 饱汉式: 为什么叫饱汉式呢?因为他的实例不是在一开始就创建好的,我们可以看作他是饱的,不着急创建实例,在需要的时候才去创建: 饱汉式优点

python中对单例模式的理解

class Foo(object): instance = None def __init__(self): pass def process(self): return '1234565' @classmethod #版本1单例模式 def get_instance(cls): if Foo.instance: return Foo.instance else: Foo.instance = Foo() return Foo.instance obj1 = Foo() print(obj1.p