标签:判断 函数声明 amp rgba 初始 懒汉式 == new 安全
在任何时刻,被指定的类只有一个实例
精髓:
1 将类的构造函数声明为私有的,确保外部不能随意通过构造函数创建对象
2 创建一个类的私有静态成员,该成员为该类的对象(静态成员保证了该对象只有一份)
3 提供一个静态函数,获取该静态成员
单例模式有多种实现方式:
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() 语句,创建出多个实例,所以线程不安全。
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 };
通过在第一次创建时加锁,保证了实例只有一份
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