单例设计模式:
单例模式,是一种常见的软件设计模式.在它的核心结构中只包含了一个被称为单例的特殊类.通过单例模式可以保证系统中只有该类的一个实例对象.
优点 :
实例控制:单例模式会阻止其它对象实例化其自己的单例对象的副本,从而确保所有对象都访问的是唯一的实例
灵活性:因为类控制了实例化过程,所以类可以很灵活的更改实例化的过程
实现单例需要如下几步(基础):
1私有化构造函数
2创建一个本类对象
3 向外提供一个方法,返回这个本类对象
1饿汉式
优点:线程安全,允许多个线程同时访问
缺点:会提前初始化单例对象(在类加载的时候)
1 /**
2 * @Author : zhuhuicong
3 * 2018/11/27 21:08
4 * @Version 1.0
5 * 懒汉式
6 */
7 public class SingalDemo01 {
8 private static SingalDemo01 singalDemo01 = new SingalDemo01();
9 private SingalDemo01() {
10 }
11
12 public static SingalDemo01 getInstance(){
13 return singalDemo01;
14 }
15 }
View Code
2懒汉式:
优点:不会提前初始化单例对象
缺点:线程不安全
解决方案可以通过加锁进行解决,但是加锁之后,效率低
1 /**
2 * @Author : zhuhuicong
3 * 2018/11/27 21:12
4 * @Version 1.0
5 */
6 public class SingalDemo02 {
7 private static SingalDemo02 singalDemo02 = null;
8 private SingalDemo02() {
9 }
10 public static synchronized SingalDemo02 getInstance(){
11 if(singalDemo02==null){
12 singalDemo02 = new SingalDemo02();
13 }
14 return singalDemo02;
15 }
16 }
View Code
3 双重检测锁机制:
线程安全并且不会提前初始化实例对象(注意两次判断检测的作用)
1 /**
2 * @Author : zhuhuicong
3 * 2018/11/27 21:17
4 * @Version 1.0
5 */
6 public class SingalDemo03 {
7 private static SingalDemo03 singalDemo03 = null;
8 private SingalDemo03() {
9 }
10
11 public static SingalDemo03 getInstance(){
12 if(singalDemo03==null){ //第一个if是为了避免每次进来都加锁,提高效率
13 synchronized (SingalDemo03.class){
14 if(singalDemo03==null){ //第二个if是为了避免生成多个实例对象
15 singalDemo03 = new SingalDemo03();
16 }
17 }
18 }
19 return singalDemo03;
20 }
21 }
View Code
4静态内部类的方式:
线程安全,并且不会提前初始化(对象只会在内部类加载的时候初始化,内部类只会在调用getInstance()方法的时候加载)
1 /**
2 * @Author : zhuhuicong
3 * 2018/11/27 21:24
4 * @Version 1.0
5 */
6 public class SingalDemo04 {
7 private SingalDemo04() {
8 }
9
10 public static class Inner{
11 public static SingalDemo04 Instance;
12 }
13
14 public static SingalDemo04 getInstance(){
15 return Inner.Instance;
16 }
17 }
View Code