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

推荐订阅源

IT之家
IT之家
Microsoft Azure Blog
Microsoft Azure Blog
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
小众软件
小众软件
F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Google DeepMind News
Google DeepMind News
Jina AI
Jina AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
aimingoo的专栏
aimingoo的专栏
B
Blog RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
宝玉的分享
宝玉的分享
有赞技术团队
有赞技术团队
J
Java Code Geeks
WordPress大学
WordPress大学
The Cloudflare 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();
    }
    }
    }

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