设计模式-单例模式
程序员文章站
2022-05-03 22:43:04
前言: 设计模式是一个经常被提及的话题,无论是日常开发还是面试,都会经常被提及。让举出一些常用的设计模式,基本都会首先列举: 单例模式 工厂模式。我们这个设计模式系列,也不去追求新颖,我们也从提及率最高的单例模式开始。 使用场景:顾名思义,单例就是单实例的意思,是指在整个系统中,某个类的对象都只存在 ......
单例模式
简介
保证某一个类在内存中仅有一个实例
应用
Spring 中的 bean 全部是单例,一些常见的工厂类或管理类都是单例
代码
-
饿汉式,静态域初始化,在 JVM 加载的时候直接放到内存里,注意私有化构造方法使实例仅类本身可以创建
public class Example01 { private static final Example01 INSTANCE = new Example01(); private Example01() {} public static Example01 instance() { return INSTANCE; } }
-
饿汉式,静态代码块初始化
public class Example05 { private static final Example05 INSTANCE; static{ INSTANCE = new Example05(); } private Example05() {} public static Example05 instance() { return INSTANCE; } }
-
饿汉式,在需要用的时候才加载
- 采用加锁的方式防止并发安全问题
- 存在问题:每一次请求得到实例都需要加锁性能低下
public class Example02 { private static Example02 INSTANCE; private Example02() {} public static Example02 instance() { synchronized (Object.class) { if(INSTANCE == null) { INSTANCE = new Example02(); } } return INSTANCE; } }
-
饿汉式2.0,改进1.0性能低下的问题
- 采用双重为null判断避免每一次进来都需要加锁
public class Example03 { private static Example03 INSTANCE; private Example03() {} public static Example03 instance() { if(INSTANCE == null) { synchronized (Object.class) { if(INSTANCE == null) { INSTANCE = new Example03(); } } } return INSTANCE; } }
-
静态内部类方式
- 静态内部类的域及代码块只有在被调用时才会被加载,可以间接实现懒加载
public class Example04 { private Example04() {} public static class Provider{ private static Example04 INSTANCE = new Example04() ; } public static Example04 instance() { return Example04.Provider.INSTANCE; } }
-
枚举,由 Java 虚拟机保证单例
public enum Example06 { SINGLE }
来源
本文地址:https://blog.csdn.net/weixin_45088998/article/details/112644975