惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Blog — PlanetScale
Blog — PlanetScale
Y
Y Combinator Blog
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
LangChain Blog
S
SegmentFault 最新的问题
J
Java Code Geeks
V
Visual Studio Blog
H
Help Net Security
Stack Overflow Blog
Stack Overflow Blog
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
H
Hackread – Cybersecurity News, Data Breaches, AI and More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - Franky
B
Blog RSS Feed
The Cloudflare Blog
MyScale Blog
MyScale Blog
月光博客
月光博客
Microsoft Security Blog
Microsoft Security Blog
美团技术团队

沐凉`Blog

沐凉·日记 沐凉·日记 沐凉·日记 Flutter开发Linux程序中文乱码解决 | 沐凉`Blog Docker安装Nginx | 沐凉`Blog 沐凉·日记 flutter loading 动画插件(flutter_spinkit 4.1.2) | 沐凉`Blog 关于使用@CrossOrigin遇见的的一些问题和理解 | 沐凉`Blog 沐凉·日记 Linux 常用指令、IntelliJ IDEA 常用快捷键 | 沐凉`Blog Spring Boot 邮件服务提供者 | 沐凉`Blog Docker 搭建redis单节点以及一主两从三哨兵模式 | 沐凉`Blog 沐凉·日记 Hello World | 沐凉`Blog Ubuntu Server 安装 Java、Tomcat、mysql | 沐凉`Blog
了解23种设计模式-单例模式 | 沐凉`Blog
2019-11-05 · via 沐凉`Blog
  • 饿汉式
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Mgr01 {
    private static final Mgr01 INSTANCE = new Mgr01();
    private Mgr01(){}
    private static Mgr01 getInstance(){return INSTANCE;}
    public void m(){
    System.out.println("m");
    }
    public static void main(String[] args) {
    Mgr01 m1 = Mgr01.getInstance();
    Mgr01 m2 = Mgr01.getInstance();
    System.out.println(m1 == m2);
    }
    }

    类加载到内存后就实例化一个单例 , JVM 保证线程安全
    缺点: 不管是否用到,类装载时就完成实例化 (通常问题不大,写法简单)

  • 懒汉式
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class Mgr02 {
    private volatile static Mgr02 INSTANCE;
    private Mgr02(){};




    public static Mgr02 getInstance(){
    if (INSTANCE == null) {

    synchronized (Mgr02.class){
    if (INSTANCE == null ){
    INSTANCE = new Mgr02();
    }
    }
    }
    return INSTANCE;
    }
    public void m(){
    System.out.println("m");
    }

    public static void main(String[] args) {
    for (int i = 0; i < 100; i++) {
    new Thread(()->{

    System.out.println(Mgr02.getInstance().hashCode());
    }).start();
    }
    }
    }

    为了保证线程安全,写法相对饿汉式麻烦,但是只有在使用时才会实例化

  • 静态内部类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class Mgr03 {
    private Mgr03(){}
    private static class Mgr03Holder {
    private static final Mgr03 INSTANCE = new Mgr03();
    }
    public static Mgr03 getInstance() {
    return Mgr03Holder.INSTANCE;
    }
    public static void main(String[] args) {
    for (int i = 0; i < 100; i++) {
    new Thread(()->{

    System.out.println(Mgr03.getInstance().hashCode());
    }).start();
    }
    }
    }

    与饿汉式类似,都是由 JVM 保证线程安全,但静态内部类是延迟加载

  • 枚举
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public enum  Mgr04 {

    INSTANCE;
    public void m(){
    System.out.println("m");
    }
    public static void main(String[] args) {
    for (int i = 0; i < 100; i++) {
    new Thread(()->{

    System.out.println(Mgr04.INSTANCE.hashCode());
    }).start();
    }
    }
    }

    枚举单例,解决线程同步,解决反序列化(不能通过反射拿到多个实例,枚举没有构造方法)