码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2021-03-30 13:47:45      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:判断   函数声明   amp   rgba   初始   懒汉式   ==   new   安全   

在任何时刻,被指定的类只有一个实例
精髓:
1 将类的构造函数声明为私有的,确保外部不能随意通过构造函数创建对象
2 创建一个类的私有静态成员,该成员为该类的对象(静态成员保证了该对象只有一份)
3 提供一个静态函数,获取该静态成员

单例模式有多种实现方式:

1 懒汉模式(线程不安全)

 1  public class Singleton 
 2     { 
 3         private static Singleton singleton = null; //限制产生多个对象 
 4         private Singleton(){ };
 5         //通过该方法获得实例对象 
 6         public static Singleton getSingleton()
 7         { 
 8             if(singleton == null)
 9             { 
10                 singleton = new Singleton(); 
11             }
12             return singleton; 
13         } 
14     };
15     

懒汉模式不安全的原因:当多个线程同时获取单例对象,且都进入了getSingle()函数,并且同时判断出 singleton == null,
此时,这多个线程都会执行 singleton = new Singleton() 语句,创建出多个实例,所以线程不安全。

2 改进的懒汉式(双重锁检查)

 1   public class Singleton 
 2     { 
 3         private static Singleton singleton = null; //限制产生多个对象 
 4         private Singleton(){ };
 5         //通过该方法获得实例对象 
 6         public static Singleton getSingleton()
 7         { 
 8             if(singleton == null)
 9             { 
10                 Lock();
11                 if(singleton == null)
12                 { 
13                     singleton = new Singleton(); 
14                 }
15                 UnLock();
16             }
17             return singleton; 
18         } 
19     };

通过在第一次创建时加锁,保证了实例只有一份

3 饿汉模式(线程安全)

 1  class Singleton 
 2     {
 3     private:
 4         static Singleton* singleton; 
 5         Singleton(); 
 6         
 7         //此处 拷贝构造函数及赋值操作符也必须声明为私有,否则可能出现多个实例
 8         Singleton( Singleton& );
 9         Singleton& operator =(const Singleton& );
10         
11     public:
12         //通过该方法获得实例对象 
13         static Singleton* getSingleton()
14         { 
15             return singleton; 
16         } 
17     };
18     
19     //静态成员变量在类外初始化(静态成员变量只能在类外初始化,所以可以在此处调用私有的构造函数)
20     Singleton* Singleton::singleton = new Singleton();

相比与懒汉模式,饿汉模式在一开始就new出了单例的实例,多线程访问时,也只是返回该实例,不会出现多次创建
但一开始就创建比较消耗空间,是一种空间换时间的做法

单例模式

标签:判断   函数声明   amp   rgba   初始   懒汉式   ==   new   安全   

原文地址:https://www.cnblogs.com/wangyueyouyi/p/14592756.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!