单例设计模式
@
一、概念叙述
单例模式是一种常用的软件设计模式,使用单例模式,可以保证为一类只生成唯一的实例对象。也就是说,整个程序空间中,该类只存在一个实例对象。
二、先看个问题
我们通常在实例化对象是,通常是通过去new构造器方法获取一个类的实例化对象。这样就会出现一个问题:那就是每次创建的实例对象的内存地址都不一样。
public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
接下来单例模式就可以解决这个问题。
三、单例模式实现
(一)、饿汉模式
package 单例模式;
/**
* 饿汉模式
* 1、初始化类对象
* 2、私有化构造器
* 3、通过静态方法还会
*/
public class Student {
// 初始化对象,当类加载时,就已经把student对象加载到了内存中
private static Student student = new Student();
private String name;
// 第一步私有化构造器
private Student() {
}
// 通过静态方法返回对象
public static Student getInstance() {
return student;
}
}
饿汉模式特点: 执行效率较高,会占用稍稍占用一点内存空间
(二)、懒汉模式
package 单例模式;
/*
* 懒汉式
* 1、先去创建对象
* 2、私有化构造
* 3、静态方法实例化对象,并返回
* */
public class Student1 {
// 先创建对象,不去实例化对象
private static Student1 student1 = null;
// 私有构造
private Student1() {
}
// 静态方法返回对象
private static Student1 getInstance() {
// 当该方法被调用的时候再去实例化对象
if(student1 == null) {
student1 = new Student1();
}
return student1;
}
}
懒汉模式特点: 懒汉模式不支持多线程,只支持单线程,不能保证线程的安全性
(三)、双重校验锁
双重校验锁就是解决懒汉模式不支持多线程的问题,我们来分析一下为什么懒汉模式不支持多线程!
双重校验锁
具体实现
package 单例模式;
/*
* 双重校验锁
* */
public class Student1 {
// 先创建对象,不去实例化对象
private static Student1 student1 = null;
// 私有构造
private Student1() {
}
// 静态方法返回对象
public static Student1 getInstance() {
// 当该方法被调用的时候再去实例化对象
if(student1 == null) {
// 设置同步代码块
synchronized (Student1.class) {
// 再一次进行判断
if(student1 == null) {
student1 = new Student1();
}
}
}
return student1;
}
}
~~~![在这里插入图片描述](https://img-blog.csdnimg.cn/20200402144821143.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDY3NjkzNQ==,size_16,color_FFFFFF,t_70)