个人对单例模式的理解

问题:单例模式有什么用处?

有些对象我们只需要一个,比如说线程池,对话框,缓存,网站计数器,任务管理器,打印机,显卡等设备的驱动程序对象。这些对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生,比如程序的异常行为,资源使用过量或者是不一致的结果等等。

解决方法:使用单例模式;

单例模式:确保一个类只有一个实例,并提供一个全局的访问点;

单例模式分类:

饱汉式:

为什么叫饱汉式呢?因为他的实例不是在一开始就创建好的,我们可以看作他是饱的,不着急创建实例,在需要的时候才去创建;

饱汉式优点:

资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法;

饱汉式缺点:

线程不安全,第一次加载时不够快,多线程使用不必要的同步开销大;

饿汉式:

饿汉式我们就可以看成他很饿,急着创建实例,在JVM加载这个类的时候就创建好了这个实例;

饿汉式的优点:

1.线程安全 ;

2.在类加载的同时已经创建好一个静态对象,调用时反应速度快;

饿汉式缺点:

可能会浪费资源,如果一直没有调用getInstance方法,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化;

饱汉式和饿汉式的区别就是两者创建实例的时间不同,饱汉式在需要的时候才去创建,饿汉式是一开始就创建好;

上面说到了饱汉式线程不安全,我们有没有办法让饱汉式安全呢?答案是肯定的;

方法一:只要把getInstance方法变为同步方法(synchronized)方法就可以避免线程安全的问题;

但是方法一有个问题:同步会降低性能,有没有不降低性能又线程安全的方法,或者说减少同步的次数?这时候就要看方法二了;

方法二:使用“双重检查锁”,在getInstance中减少使用同步;

双重检查锁也存在缺点:第一次加载时反应不快,由于java内存模型一些原因偶尔失败

总结:一般建议采用饿汉式,不建议采用饱汉式;

原文地址:https://www.cnblogs.com/yang457556017/p/9060201.html

时间: 2024-11-06 22:41:17

个人对单例模式的理解的相关文章

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.单例类确保自己只有一个实例(构

单例模式的理解

一.什么是单例模式 单例模式的作用是保证应用程序在任何时刻只存在一个单例对象,比如打印机,一旦开始打印了就不再接收其他打印任务,一直到当前任务结束,否则会出现打印出的东西里存在多个任务中的信息: 二.单例的特征 [1] 单例只能有一个实例: [2] 单例只能自己实例化唯一实例: [3]单例必须向其他对象提供这一实例: 三.常见单例的模式 [1]饿汉式:不管其他对象需不需要单例的唯一实例,我都先完成实例化,你要就拿不用就放那: 1 package com.zyy.stop; 2 3 public

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