.课程网站
单例模式
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。
1、懒汉模式

优点:单例在第一次使用时进行实例化创建。
缺点:线程不安全,可能多个线程去创建多个实例。
2、懒汉+锁模式

优点:单例在第一次使用时进行实例化创建。
缺点:synchronized修饰方法,只允许一个线程执行getInstance()方法,影响了性能。
3、饿汉模式

优点:线程安全,类在加载时就实例化创建对象,没有资源的竞争。
缺点:
1、当构造函数的处理较多时,类加载的时候会很慢,影响性能。
2、如果这个类在后面不会被使用到,则导致资源的浪费。
4、双重同步锁模式

优点:单例在第一次使用时进行实例化创建。
缺点:线程不安全。 线程不安全原因:指令重排序
1、memory = allocate() 分配对象的内存空间
2、ctorInstance() 初始化对象
3、instance = memory 设置instance指向刚分配的内存
JVM和CPU优化,发生指令重排:1->3->2
因为2和3逻辑上没有直接关系,可以发生指令重排。由于指令重排导致线程不安全的原因分析:当线程A进入同步锁,开始创建对象时,执行到3,给instance分配内存空间,此时线程B过来获取instance实例时,直接取到了这个并未初始化的实例, 导致后续使用这个未初始化的实例访问时报错。
5、双重同步锁+volatile

优点:
1、单例在第一次使用时进行实例化创建。
2、线程安全
缺点:volatile修饰变量,实现了多线程之间的数据可见性,但是影响了性能。
6、枚举模式(推荐使用)

优点:
1、线程安全:类似常量,在类加载时就初始化,并且枚举的私有构造方法只会被调用一次(第一次调用),不会有资源竞争问题。
2、资源节约性:在类加载时只会初始化,不会实例化,只有在第一次调用时实例化对象,不会造成资源的浪费。
网友评论