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() {  
    }  
}
相关推荐
步行cgn8 分钟前
Spring c 命名空间注入详解
java·后端·spring
明月_清风26 分钟前
Maven 到底是什么?一篇文章搞懂 Java 项目构建与依赖管理
java·后端·maven
aramae1 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
Rain的Java大神之路1 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
Wang's Blog2 小时前
Java 接入Redis: 通用命令与键管理
java·服务器·redis
Wang's Blog2 小时前
Java 接入Redis: 列表集合与有序集合操作命令
java·服务器·redis
Ivanqhz2 小时前
SVD++算法
java·服务器·网络·深度学习·神经网络
qq_2518364573 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
caoerzhong3 小时前
JeeWMS 开源仓库管理系统全景解读:一套 Java WMS 如何把 WMS/OMS/BMS/TMS 装进同一个系统
java·开源
曹牧4 小时前
Java集合框架:List、ArrayList、Map 和 HashMap
java