单例模式实现的四种方法详解

简介: 单例模式实现的四种方法详解

单例设计模式

1.饿汉式

代码实现:

public class Test {
    public static void main(String[] args) {
        Single single = Single.getSingle();
    }
}
class Single{
    private Single(){}
    private static Single s = new Single();
    public static Single getSingle(){
        return s;
    }
}

2.懒汉式

延迟加载, 只有在真正使用的时候,才开始实例化。

线程安全问题

double check 加锁优化

编译器(JIT),CPU 有可能对指令进行重排序,导致使用到尚未初始化 的实例,可以通过添加volatile 关键字进行修饰, 对于volatile 修饰的字段,可以防止指令重排。

代码实现

class Single {
  // 禁止指令重排
    private volatile static Single s;
    private Single() {
    }
    public static Single getSingle() {
        if (s == null) {
            synchronized (Single.class) {
                if (s == null) {
                    s = new Single();
                    // 字节码层
                    // JIT , CPU 有可能对如下指令进行重排序
                    // 1 .分配空间
                    // 2 .初始化
                    // 3 .引用赋值
                    // 如重排序后的结果为如
                    // 1 .分配空间
                    // 3 .引用赋值 如果在当前指令执行完,有其他线程来获取实例,将拿到尚未初始化好的实例
                    // 2 .初始化
                }
            }
        }
        return s;
    }
}

2.静态内部类

本质上是利用类的加载机制来保证线程安全

只有在实际使用的时候,才会触发类的初始化,所以也是懒加载的一 种形式。

代码实现

class Single {
    private static class InnerSingle {
        private static Single s = new Single();
    }
    private Single() {
        // 防止利用反射攻击
        if(InnerSingle.s == null){    
            throw new RuntimeException("单例不允许多个实例");
        }
    }
    public static Single getSingle() {
        return InnerSingle.s;
    }
}

4.枚举类

天然不支持反射创建对应的实例,且有自己的反序列化机制

利用类加载机制保证线程安全

代码实现

public enum EnumSingleton {
    INSTANCE;
}


目录
相关文章
|
21天前
|
设计模式 安全 C#
单例模式详解
单例模式是一种常用的创建型设计模式,确保某个类只有一个实例,并提供一个全局访问点。本文详细介绍了单例模式的定义、特点、适用场景、优缺点及实现代码(C++ 和 C#),并探讨了线程安全的实现细节和与依赖注入的结合使用。
28 0
|
8月前
|
设计模式 安全 Java
单例模式
​ 如有错误或有补充,以及任何的改进意见,请在评论区留下您的高见,同时文中给出大部分的示例 如果觉得本文写的不错,不妨点个赞,收藏一下,助力博主产生质量更高的作品 概念 单例模式(Singleton Pattern)是软件设计模式的一种,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式通常用于需要频繁创建和销毁同一对象的场景,以减少系统资源的消耗和提高性能。 优缺点 优点: 实例控制:单例模式确保类只有一个实例,可以防止其他对象实例化自己的副本,从而确保所有对象都访问唯一实例。 节约资源:由于系统中只存在一个对象,可以节约系统资源,特别是在需要频繁创建和销毁对象的场景中,可
66 0
|
8月前
|
C++
【C++ 单例模式】
【C++ 单例模式】
|
8月前
|
设计模式 安全
【单例模式】—— 每天一点小知识
【单例模式】—— 每天一点小知识
|
安全 Java
单例模式很简单
《基础系列》
126 0
单例模式很简单
|
设计模式 缓存 JSON
没那么简单的单例模式
没那么简单的单例模式
132 0
没那么简单的单例模式
|
存储 安全 调度
单例模式的简单介绍
单例模式的简单介绍
|
设计模式 安全 Java
回顾一下单例模式
回顾一下单例模式
|
设计模式 缓存
我学会了,单例模式
单例模式属于创建型模式,这个类型的设计模式是将 对象的创建和使用解耦了,花式的去创建对象。
140 0
我学会了,单例模式
|
数据采集 设计模式 算法
大佬,人人都说精通的单例模式,你精通了吗
大佬,人人都说精通的单例模式,你精通了吗
94 0
大佬,人人都说精通的单例模式,你精通了吗