设计模式之单例模式

单例模式适用场景为 1.需要频繁实例化然后销毁的对象。 2.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 3.有状态的工具类对象。 4.频繁访问数据库或文件的对象。 

通常单例模式与静态类会拿来比较,一般如果想要利用唯一的实例保存系统的状态,这时应该选用单例模式,如果仅仅是想不自己创建类的实例就可以调用到某些方法来完成一定的操作,那完全没必要也不应该使用单例模式。

单例模式的实现有多种方式,但是考虑到线程安全与执行效率一般生产环境下会采用一下模式:

        关于volatile关键字这里做简单介绍。在并发编程中常常关注:原子性、可见性、有序性三个问题,volatile和synchronized关键字也是经常被提到的两个关键字。volatile关键字可以保证可见性和有序性(防止指令重排),而synchronized可以保证原子性。

        1、使用volatile 修饰实例变量,是为了避免多线程情况下,会出现A线程执行初始化,但可能因为构造函数里面的操作太多了,所以A线程的singleton实例还没有造出来,但已经被赋值了。而B线程这时过来了,错以为 singleton  已经被实例化出来,一用才发现 singleton  尚未被初始化。

        2、两次判断singleton为空是因为并把synchronized操作放在第一次判空后是因为,同步操作执行效率低,如果singleton不为空就避免了同步操作。第二次判空是为了防止在构造同步锁的同时另一个线程已经实例化了singleton。

你可能感兴趣的:(设计模式之单例模式)