设计模式之单例模式分析

单例模式分为两大类:懒汉式和饿汉式

其最主要的区别在于:

懒汉式:指全局的单例实例在第一次被使用时构建

饿汉式:指全局的单例实例在类装载时构建

日常我们使用的最多也是懒汉式,懒汉式是按需加载,能够做到资源的最大利用

懒汉式:

虽然这样写没什么问题,但是如果是多线程时可能出现问题了,如果多个线程同时访问 都判断了instance是否为null可能会创建两个实例

这时想到用synchronized加锁

这样的话如果两个线程同时访问的话就会有一个是在等待,可以避免出现创建两个实例的情况当然这还是会有效率问题就是每次只能一个线程访问,其他线程要等待

这里做了两次判断,如果instance为null就锁定,否侧可以多个线程同时访问,可以有效的解决Single2中的效率问题

但是synchronized虽然保证了原子性,但却没有保证指令重排序的正确性,会出现A线程执行初始化,但可能因为构造函数里面的操作太多了,所以A线程的uniqueInstance实例还没有造出来,但已经被赋值了。而B线程这时过来了,错以为uniqueInstance已经被实例化出来,一用才发现uniqueInstance尚未被初始化。我们的线程虽然可以保证原子性,但程序可能是在多核CPU上执行。加上可以有效的保证原子性,线程达到安全。

饿汉式:

在类装载时构建,相对于懒汉式的问题来说这是一个很完美的但也有很多缺点 :初始化太早,资源浪费,如果本省依赖其他数据,难以保证其他数据在它初始化之前准备好。

单例就讲这么多,学的还是不够

原文地址:https://www.cnblogs.com/LIUWEI123/p/6748603.html