单例模式
- 饿汉模式
package com.wz.cinema.platform.server.util;
public class DataManager {
/**
* 单例模式:整个类在运行中只会有一个实例
* 既然是在运行中只有一个实例,那么就必须
* 考虑多线程环境
*
* 单例模式分为懒汉模式和饿汉模式
* 饿汉模式本身就是线程安全的单例
*/
//饿汉模式(实例开始会初始化)
private DataManager(){
}
private static final DataManager instance = new DataManager();
public static DataManager getInstance(){
return instance;
}
}
- 懒汉模式
package com.wz.cinema.platform.server.util;
public class DataManager {
/**
* 单例模式:整个类在运行中只会有一个实例
* 既然是在运行中只有一个实例,那么就必须
* 考虑多线程环境
*
* 单例模式分为懒汉模式和饿汉模式
* 饿汉模式本身就是线程安全的单例
*/
//懒汉模式没有初始值,第一次用的时候才会赋值
//考虑多线程并发情况下依然存在多例
private static volatile DataManager instance;
// public static DataManager getInstance(){
// //先判断在赋值
// if (instance== null){
// instance = new DataManager();
// }
// return instance;
// }
//加锁,在方法上家的锁从效率层面来说比较低下】
//因为整个类只有一个实例,只需要第一个方位的线程将实例创建出来之后
//后面的线程秩序要拿出实例即可
//方法上加锁会让抢到锁的线程拿到实例,其他线程都会阻塞
//public synchronized static DataManager getInstance(){
// //先判断在赋值
// if (instance== null){
// instance = new DataManager();
// }
// return instance;
//}
//判断实例为空时才会抢锁,不为空直接返回实例
public static DataManager getInstance(){
//先判断在赋值
if (instance== null){
synchronized (DataManager.class){
if (instance == null){
instance = new DataManager();
}
}
}
return instance;
}
}
双检锁:double-check-lock
双重检查锁(Double-Check Lock,也称为双重检查锁定)是在单例模式中使用的一种优化技术,用于在多线程环境下延迟初始化实例并保证线程安全。