JAVA---单例模式
单例模式
单例的目的是保证某个类仅有一个实例。当有某些类创建对象内存开销较大时可以考虑使用该模式。单例模式又分为 饿汉式 和 懒汉式。
1.饿汉式(线程安全)
饿汉式。顾名思义,该模式在类被加载时就会实例化一个对象。
该模式能简单快速的创建一个单例对象,而且是线程安全的(只在类加载时才会初始化,以后都不会)。但它有一个缺点,就是不管你要不要都会直接创建一个对象,会消耗一定的性能
//饿汉式
public class Hungry {
private Hungry(){}
private final static Hungry HUNGRY = new Hungry();
public static Hungry getInstance(){
return HUNGRY;
}
}
2.懒汉式(线程不安全--需要加锁)
2.懒汉式。该模式只在你需要对象时才会生成单例对象(比如调用getInstance方法)但他不是线程安全的
//懒汉式
public class LazyMan {
private LazyMan() {
System.out.println(Thread.currentThread().getName() + "--ok");
}
private volatile static LazyMan lazyMan;//保证并发内存可见性,有序性,可以防止指令重排,但不能保证原子性
public static LazyMan getInstance() {
//双重检测锁模式 懒汉式单例 简称DCL
if (lazyMan == null) {
synchronized (LazyMan.class) {//synchronized保证并发内存可见性,有序性,原子性
if (lazyMan == null) {
lazyMan = new LazyMan();//不是原子性操作,可能会造成指令重排
}
}
}
return lazyMan;
}
//单线程ok,多线程不行
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(LazyMan::getInstance).start();
}
}
}
3.静态内部类(线程安全)
public class Holder {
private Holder() {
}
public static Holder getInstance() {
return InnerClass.HOLDER;
}
public static class InnerClass {
private static final Holder HOLDER = new Holder();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)