深入单例模式(理解理解)

  1 /***
  2  * 1. 最简单的实现
  3  *
  4  *
  5  */
  6
  7 /*
  8 public class SingletonClass {
  9     private SingletonClass(){}
 10     private static final SingletonClass instance=new SingletonClass();
 11     private static SingletonClass getInstance(){
 12         return instance;
 13     }
 14
 15 }
 16 */
 17 /**
 18  *
 19  * 2.性能优化
 20  *
 21  */
 22 /*public class SingletonClass{
 23     private SingletonClass(){}
 24     private static SingletonClass instance=null;
 25     public static SingletonClass getInstance(){
 26         if(instance==null){
 27             instance=new SingletonClass();
 28         }
 29         return instance;
 30     }
 31 }*/
 32 /***
 33  *
 34  * 3、同步,应对多线程
 35  *
 36  */
 37 /*public class SingletonClass{
 38     private SingletonClass() {
 39     }
 40     private static SingletonClass instance=null;
 41     public synchronized static SingletonClass getInstance(){
 42         if(instance==null){
 43             instance=new SingletonClass();
 44         }
 45         return instance;
 46
 47     }
 48 }
 49     */
 50 /***
 51  * 4.又是性能
 52  */
 53 /*public class SingletonClass{
 54     private SingletonClass(){}
 55     private static SingletonClass instance=null;
 56     public static SingletonClass  getInstance(){
 57         synchronized(SingletonClass.class){
 58             if(instance==null){
 59                 instance=new SingletonClass();
 60             }
 61         }
 62         return instance;
 63     }
 64 }
 65 */
 66 //double-checked locking设计
 67 /*public class SingletonClass{
 68     private SingletonClass(){}
 69     private static SingletonClass instance=null;
 70     public SingletonClass getInstance(){
 71         if(instance==null){
 72             synchronized(SingletonClass.class){
 73                 if(instance==null){
 74                     instance=new SingletonClass();
 75                 }
 76             }
 77         }
 78         return instance;
 79     }
 80 }*/
 81 /***
 82  * 5. 从源头检查
 83  */
 84 /**
 85  *
 86  * 创建一个变量需要哪些步骤呢?一个是申请一块内存,调用构造方法进行初始化操作,另一个是分配
 87  * 一个指针指向这块内存。这两个操作谁在前谁在后呢?JVM规范并没有规定。那么就存在这么一种情况,
 88  * JVM是先开辟出一块内存,然后把指针指向这块内存,最后调用构造方法进行初始化。下面我们来考虑
 89  * 这么一种情况:线程A开始创建SingletonClass的实例,此时线程B调用了getInstance()方法,首先
 90  * 判断instance是否为null。按照我们上面所说的内存模型,A已经把instance指向了那块内存,只是
 91  * 还没有调用构造方法,因此B检测到instance不为null,于是直接把instance返回了——问题出现了,
 92  * 尽管instance不为null,但它并没有构造完成,就像一套房子已经给了你钥匙,但你并不能住进去,
 93  * 因为里面还没有收拾。此时,如果B在A将instance构造完成之前就是用了这个实例,程序就会出现错误了!
 94  *
 95  */
 96 /*public class SingletonClass{//wrong job
 97     private SingletonClass(){}
 98     private static SingletonClass instance=null;
 99     public static SingletonClass getInstance(){
100         if(instance==null){
101             SingletonClass sc;
102             synchronized(SingletonClass.class){
103                 sc=instance;
104                 if(sc==null){
105                     synchronized(SingletonClass.class){
106                         if(sc==null){
107                             sc=new SingletonClass();
108                         }
109                     }
110                 }
111                 instance=sc;
112             }
113
114         }
115         return instance;
116     }
117 }*/
118
119 /***
120  *
121  * 6.解决方案
122  *
123  */
124 //在JDK 5之后,Java使用了新的内存模型。volatile关键字有了明确的语义——在JDK1.5之前,
125 //volatile是个关键字,但是并没有明确的规定其用途——被volatile修饰的写变量不能和之前的读写代码调整,
126 //读变量不能和之后的读写代码调整!因此,只要我们简单的把instance加上volatile关键字就可以了。
127 /*public class SingletonClass{
128     private SingletonClass(){}
129     private volatile static SingletonClass instance=null;
130     public static SingletonClass getInstance(){
131         if(instance==null){
132             synchronized(SingletonClass.class){
133                 if(instance==null){
134                     instance=new SingletonClass();
135                 }
136             }
137         }
138         return instance;
139     }
140 }*/
141 /***
142  * 推荐用法
143  */
144 /*public class SingletonClass{
145     private SingletonClass(){}
146     //Java的静态内部类
147     private static class SingletonClassInstance{
148         private  static final SingletonClass instance=new SingletonClass();
149     }
150     public static SingletonClass getInstance(){
151         return SingletonClassInstance.instance;
152     }
153 }
154 */
时间: 2024-10-29 19:09:48

深入单例模式(理解理解)的相关文章

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