java单例模式
单例模式
- 单例模式可分为:饿汉式 、DCL懒汉式
注意: 构造器私有化是单例模式的一个重要思想。
一、饿汉式
/**
* @author lm
* @title: Hungry 饿汉式单例模式
* @projectName studio
* @description: TODO
* @date 2021/11/322:50
*/
public class Hungry {
//单例模式 构造私有化,防止创建
private Hungry(){
}
//创建对象信息(饿汉式:开始即创建)
private final static Hungry hungry = new Hungry();
//返回对象信息
public static Hungry getInstance(){
return hungry;
}
}
- 缺点:饿汉式单例模式初始化创建就会加载所有的资源,所以可能会产生垃圾对象,浪费空间。
- 优化:在使用时再进行创建加载,所以引出懒汉式单例模式。
二、懒汉式
/**
* @author lm 懒汉式
* @title: Lazy
* @projectName studio
* @description: TODO
* @date 2021/11/323:01
*/
public class Lazy {
// 构造器私有化
private Lazy(){
}
// 声明对象
private static Lazy lazy;
// 当lazy为null时,创建并返回lazy实例
public static Lazy getInstance(){
if(lazy ==null){
lazy = new Lazy();
}
return lazy;
}
}
- 上述代码实现了在使用时创建对象的能力,相比于饿汉式,在实现上得到了优化。
- 缺点:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作
Ⅰ:双层检测锁模式(DCL)
/**
* @author lm 懒汉式
* @title: Lazy
* @projectName studio
* @description: TODO
* @date 2021/11/323:01
*/
public class Lazy {
// 构造器私有化
private Lazy(){
System.out.println(Thread.currentThread().getName() + "ok");
}
// 声明对象
private static Lazy lazy;
// 双重检测锁模式的 懒汉式单例 DCL懒汉式
public static Lazy getInstance(){
if (lazy==null) {
synchronized (Lazy.class){
if(lazy ==null){
lazy = new Lazy();
}
}
}
return lazy;
}
// 主方法起10个线程调用
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {