深入理解Java单例模式及其两种模式的区别

目录

导言:

一、单例模式的原理

二、饿汉式单例模式

三、懒汉式单例模式

四、饿汉式与懒汉式的区别

结论:


导言:

单例模式是一种常用的设计模式,用于确保某个类只有一个实例,并提供一个全局访问点。在Java中,单例模式有两种主要的实现方式,即饿汉式和懒汉式。本文将深入探讨Java单例模式的原理、应用场景以及这两种模式的区别。

一、单例模式的原理

单例模式的核心思想是将类的实例限制为一个,并提供一个全局访问点。这样可以确保在整个应用程序中,只有一个该类的实例存在。为了实现单例模式,在Java中通常需要注意以下几点:

  • 将类的构造方法私有化,防止其他类直接实例化该类。
  • 在类内部创建该类的唯一实例,通常是作为静态成员变量。
  • 提供一个公共的方法来获取该实例,通常是作为静态方法。

二、饿汉式单例模式

饿汉式单例模式是指在类加载时就创建了该类的实例,因此被称为“饿汉”模式。

在这种模式下,无论是否需要使用该实例,都会提前创建出来。这样可以保证在后续的使用中,直接返回该实例,没有额外的线程安全问题。

饿汉式的缺点是可能会浪费内存空间,因为实例在类加载时就被创建了。

//饿汉式构建单例类
class SingleTon {
    //1.静态私有数据成员,产生唯一对象
    private static SingleTon single = new SingleTon();
    //2.私有化构造方法
    private SingleTon() { }
    //3.取得唯一实例对象的公共静态成员方法
    public static SingleTon getInstance() {
        return single;
    }
}

三、懒汉式单例模式

懒汉式单例模式是指在需要使用该实例时才进行创建,因此被称为“懒汉”模式。

在这种模式下,首次调用获取实例的方法时,才会进行实例化。

懒汉式的优点是节省了内存空间,只有在需要使用时才会创建实例。

然而,懒汉式的实现需要考虑线程安全问题,需要在获取实例的方法中进行同步操作,以避免多线程下出现重复创建实例的情况。

//懒汉式构建单例类
class SingleTon{
    //1.静态私有数据成员,没有产生唯—对象
    private static SingleTon single= null; 
    private SingleTon() { }         //2.私有化构造方法
    //3.取得唯一实例对象的公共静态成员方法,如果没有唯一实例化对象则产生该对象
    public static SingleTon getInstance(){
        if (single==null)
            single= new SingleTon();
        return single; 
    }
}

四、饿汉式与懒汉式的区别

                饿汉式                 懒汉式
创建时间类加载时就创建了实例需要使用时才进行实例化
线程安全性天生是线程安全的

需要考虑线程安全

(需要通过同步方法或双重检查锁定等机制来保证线程安全)

内存占用

占用了一定的内存空间

(在类加载时就创建了实例)

节省了内存空间

(在需要时才创建实例)

结论:

单例模式是一种常用的设计模式,用于确保某个类只有一个实例,并提供一个全局访问点。在Java中,饿汉式和懒汉式是两种主要的实现方式。饿汉式在类加载时就创建了实例,天生线程安全,但可能浪费内存空间;懒汉式在需要时才进行实例化,节省了内存空间,但需要考虑线程安全问题。根据具体的应用场景和需求,选择适合的单例模式实现方式。

类加载: 

java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中。其中类装载器的作用其实就是类的加载。

线程安全

Java线程是程序中的执行单元,用于实现多任务处理。线程安全是指在多线程环境下,对共享资源的访问和操作能够保证正确性和一致性。为了保证线程安全,可以采取同步机制、数据封装、原子操作和使用线程安全的集合类等措施。通过合理的设计和编码,可以避免竞态条件、数据不一致性和死锁等线程安全问题的发生。

希望本文能够帮助您更深入地理解Java单例模式及其两种模式的区别。如有任何问题或疑问,请随时提出。谢谢阅读!
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值