目录
(3)方法上添加synchronized锁的懒汉模式(造成系统瓶颈)
(3)添加双重校验锁的懒汉模式(JVM指令重排可能导致程序出错)
单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。
传统的创建类代码
/**
* @author:py
* @date:
* @description:传统创建类实例
* @version:
*/
public class Case_1 {
public static void main(String[] args) {
Singleton singleton1 = new Singleton();
Singleton singleton2 = new Singleton();
}
}
/**
* @author:py
* @date:
* @description:单例类
* @version:
*/
class Singleton {
}
每次new Singleton()就会创建一个Singleton实例,并不符合单例类只有一个实例的要求。
单例类创建
(1)饿汉模式(以空间换时间,可能存在资源消耗问题)
Step 1. 构造函数私有化。
Step 2. 自行对外提供实例。
Step 3. 提供外界可以获得该实例的方法。
/**
* @author:py
* @date:
* @description:单例模式实例
* @version:
*/
public class Case_1 {
public static void main(String[] args) {
// Singleton singleton1 = new Singleton();
//单例
Singleton singleton2 = Singleton.getInstance();
}
}
/**
* @author:py
* @date:
* @description:单例类(饿汉模式)
* @version:
*/
class Singleton {
// step 2.自行对外提供实例
private static Singleton singleton = new Singleton();
//step 1.构造函数私有化
private Singleton(){}
//step 3.提供外界可以获得该实例的方法
public static Singleton getInstance() {
return singleton;
}
}
(2)懒汉模式(可能存在线程不安全问题)
如果创建单例对象会消耗大量资源,可以用懒汉模式延迟创建对象。但是在多线程并发的情况下使用懒汉模式,会并发调用getInstance()方法,导致系统同时创建多个单例类实例。
/**
* @author:py
* @date:
* @description:单例模式实例
* @version:
*/
public class Case_1 {
public static void main(String[] args) {
// Singleton singleton1 = new Singleton();
//单例
Singleton singleton2 = Singleton.getInstance();
}
}
/**
* @author:py
* @date:
* @description:单例类(懒汉模式)
* @version:
*/
class Singleton {
// step 2.自行对外提供实例
private static Singleton singleton = null;
//step 1.构造函数私有化
private Singleton(){}
//step 3.提供外界可以获得该实例的方法
public static Singleton getInstance() {
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
(3)方法上添加synchronized锁的懒汉模式(造成系统瓶颈)
添加synchronized锁可以保证线程安全,但在每次访问getInstance()方法时都会进行加锁和解锁的操作,同时synchronized锁添加在方法上