java 单例模式

单例模式是最简单的设计模式之一。即一个类负责创建自己的对象,同时确保只有单个对象被创建,提供一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

1、懒汉式,线程不安全

java 复制代码
public class Singleton {
	private static Singleton instance;
	private Singleton() {}
	public static Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton()
		}
		return instance;
	}
}

这种方式的特点是线程不安全

2、加锁,线程安全

java 复制代码
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

效率很低,因为在绝大部分情况下并不需要同步

3、饿汉式

常用,但容易产生垃圾对象

java 复制代码
public class Singleton {
	private static Singleton instance = new Singleton();
	private Singleton() {}
	public static Singleton getInstance() {
		return this.instance
	}
}

4、双检锁/双重校验锁(DCL,即double-checked locking)

java 复制代码
public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
            if (singleton == null) {  
                singleton = new Singleton();  
            }  
        }  
    }  
    return singleton;  
    }  
}

由于只有在很少的情况下会出现需要同步的情况,所以先通过singleton == null 减少进入的概率,然后使用一个类锁保证线程安全

5、静态内部类

java 复制代码
public class Singleton {  
    private static class SingletonHolder {  
    	private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
        return SingletonHolder.INSTANCE;  
    }  
}

静态内部类的加载时机是第一次被引用的时候

getInstance方法返回的始终是静态对象INSTANCE,当这个方法被调用时,SingleTonHolder才在SingleTon的运行时常量池里,把符号引用替换成了直接引用,这时才真正创建了静态对象INSTANCE

因此,静态内部类方法在创建过程中是线程安全的,且延迟了单例的实例化

6、枚举

java 复制代码
public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
}
相关推荐
用户3126874877203 小时前
ConcurrentHashMap 怎么保证线程安全?从分段锁到 CAS+synchronized
java
vipxieliang3 小时前
ValidX vs Apache Commons Validator:功能与性能对比
java·spring boot
SimonKing3 小时前
升级Spring Boot 4后,从 Jackson 2 到 3,到底有哪些变化
java·后端·程序员
吃饱了得干活3 小时前
一篇讲清楚Spring Boot:自动装配、启动器、过滤器、拦截器、设计模式
java·spring boot·后端
lhldsg5 小时前
AI零售系统实战指南:从架构设计到落地部署全解析
java·人工智能·小程序·uni-app·零售
Interview Aid1125 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
mldong5 小时前
换了工作流引擎,前端一行代码没改
java·架构
CoderIsArt12 小时前
C#中UI 线程与 Dispatcher
开发语言·ui·c#
微尘寒风13 小时前
【Git】的安装和使用
java·git
y = xⁿ13 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习