定义:确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例 场景:确保某个类只有一个对象的场景,避免产生多个对象消耗过多资源。如,访问IO、DB等资源时,就要考虑使用单例模式
class Singleton1 {// 饿汉式 private static Singleton1 intance = new Singleton1();//直接初始化 private Singleton1() {} public static Singleton1 getInstance() { return intance; } } class Singleton2 {// 懒汉式 private static Singleton2 intance; private Singleton2() {} public static Singleton2 getInstance() {//用到的时候 才加载 if (intance == null) { intance = new Singleton2(); }return intance; } } class Singleton3 {// 懒汉式 线程安全 private static Singleton3 intance; private Singleton3() {} public synchronized static Singleton3 getInstance() {//用到的时候 才加载, 加锁 多线程调用,都有一个加锁的动作 if (intance == null) { intance = new Singleton3(); } return intance; } } class Singleton4 {// 懒汉式 线程安全 private static Singleton4 intance; private Singleton4() {} public static Singleton4 getInstance() {//用到的时候 才加载 synchronized (Singleton4.class) {// 加锁 if (intance == null) { intance = new Singleton4(); } } return intance; } } public class Singleton {//双重检查 懒汉式 线程安全 private static Singleton intance; private Singleton() {} public static Singleton getInstance() { if (intance == null) {//检查1:如果为null,再执行到下一步加锁;不为null不执行加锁操作 synchronized (Singleton.class) {//类级锁 if (intance == null) {//检查2:为null,才new一个实例 intance = new Singleton(); } } } return intance; } }
静态内部类单例模式: 延迟加载,线程安全
public class StaticInnerClassSingleton implements Serializable { private StaticInnerClassSingleton() { } public static StaticInnerClassSingleton getInstance() { return Builder.instance; } private static class Builder { private static StaticInnerClassSingleton instance = new StaticInnerClassSingleton(); } private Object readResolve() throws ObjectStreamException { return Builder.instance; } }
关于函数:readResolve(), 反序列化时的钩子函数,它是私有的,重写防止在反序列化时生成新的实例
以上所有单例方式都有这个问题,严格来说都需要重写
枚举:可以有属性和方法,一个元素的枚举即是单例模式,默认线程安全
public enum SingletonEnum { INSTANCE_A; private SingletonEnum() {//构造方法只能是private的,不写也是 id = idGenerate++; } public String aa; public String getAa() { return aa; } private int idGenerate = 1000; private final int id; public int getId() { return id; } }
以上是java 单例模式的简单实现的详细内容。更多信息请关注PHP中文网其他相关文章!
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前By尊渡假赌尊渡假赌尊渡假赌
刺客信条阴影:贝壳谜语解决方案
3 周前ByDDD
Windows 11 KB5054979中的新功能以及如何解决更新问题
2 周前ByDDD
威尔R.E.P.O.有交叉游戏吗?
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

Atom编辑器mac版下载
最流行的的开源编辑器

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用