@
一、概念叙述
单例模式是一种常用的软件设计模式,使用单例模式,可以保证为一类只生成唯一的实例对象。也就是说,整个程序空间中,该类只存在一个实例对象。
二、先看个问题
我们通常在实例化对象是,通常是通过去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)
来源:https://www.cnblogs.com/geq2020/p/12630272.html