单例实现方式:
1.单例装饰器;
2.使用类;
3.使用元类
1.单例装饰器(非线程安全)
通过装饰器使一个类变成单例类,但是并非线程安全的,多线程状态下,每个线程创建不同的实例,因为没有加线程锁,所以无法阻止其他线程创建新的实例,代码如下:
调用多线程执行函数:
结果:
2.使用类的方式实现单例(非线程安全)
结果:
怎么实现单例线程安全,通常做法就是加线程锁:
结果:
加了线程锁后,可以实现创建单例线程安全;
3.使用元类
结果:
总结:
1.不管用什么方式实现单例,其主要逻辑都是判断是否存在已经创建的实例,有就返回已经创建过的实例,没就实例化一个实例并存储起来;
2.单例在单线程模型下,是线程安全的,不管怎么样创建实例,都有且只有一个,而面对多线程任务时,一般的单例代码无法承担多线程任务,当有io延时操作时,会生成id不同的实例,所以如果需要实现多线程单例,那么就在创建实例时增加线程锁;
3.实现单例的方式不止三种,只要你抓住if判断的主要逻辑点,就能实现单例,所以单例的实现方式是多种多样的,这里列举了比较常用的三种;