Java设计模式-单例模式

这篇具有很好参考价值的文章主要介绍了Java设计模式-单例模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

单例模式是一种设计模式,它确保一个类只能创建一个实例,并提供一种全局访问这个实例的方式。在Java中,单例模式可以通过多种方式来实现,其中最常见的是使用私有构造函数和静态方法实现

二、基本语法

在Java中,实现单例模式的方式有多种,其中最常见的实现方式包括以下几种:

1、懒汉式单例模式

懒汉式单例模式指的是在第一次使用单例对象时才创建实例。具体实现方式是在getInstance()方法中判断实例是否已经被创建,如果没有则创建一个新实例并返回。懒汉式单例模式的缺点是线程不安全,在多线程环境下可能会创建多个实例。

public class Singleton {
    private static Singleton instance;
    
    private Singleton() {
        // 私有构造函数
    }
    
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

2、饿汉式单例模式

饿汉式单例模式指的是在类加载时就创建实例,因此也被称为静态单例模式。具体实现方式是将实例化语句放在静态代码块中。由于在类加载时就创建了实例,因此不存在线程安全性问题。

public class Singleton {
    private static Singleton instance = new Singleton();
    
    private Singleton() {
        // 私有构造函数
    }
    
    public static Singleton getInstance() {
        return instance;
    }
}

3、双重检验锁单例模式

双重检验锁单例模式是一种线程安全的单例模式实现方式,它通过使用synchronized关键字来确保线程安全性。具体实现方式是在getInstance()方法中添加双重检验锁,这可以避免不必要的锁竞争和实例化。

public class Singleton {
    private static volatile Singleton instance;
    
    private Singleton() {
        // 私有构造函数
    }
    
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

4、静态内部类单例模式

静态内部类单例模式是一种比较常用的单例模式实现方式,它利用了静态内部类只会在被使用时才会加载的特点,从而避免了饿汉式单例模式的资源浪费和懒汉式单例模式的线程不安全问题。

public class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    
    private Singleton() {
        // 私有构造函数
    }
    
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

5、枚举单例模式

枚举单例模式是一种更为简单和安全的单例模式实现方式,它利用了Java中枚举类型本身就是单例的特点。枚举单例模式是一种天然线程安全的单例模式实现方式,而且可以防止反射和序列化等攻击。

public enum Singleton {
    INSTANCE;
    
    // 其他方法
}

6、ThreadLocal单例模式

ThreadLocal单例模式是一种可以在多线程环境下确保单例对象的线程安全单例模式实现方式。具体实现方式是在ThreadLocal中保存单例对象,每个线程都有自己的ThreadLocal副本,从而避免了线程安全性问题。

public class Singleton {
    private static final ThreadLocal<Singleton> INSTANCE = new ThreadLocal<Singleton>() {
        @Override
        protected Singleton initialValue() {
            return new Singleton();
        }
    };
    
    private Singleton() {
        // 私有构造函数
    }
    
    public static Singleton getInstance() {
        return INSTANCE.get();
    }
}

7、注册式单例模式

注册式单例模式指的是通过一个注册表来管理所有单例对象,从而实现单例模式。具体实现方式是在一个静态的Map中保存所有单例对象,然后在需要使用单例对象时通过Map来获取。

public class Singleton {
    private static Map<String, Singleton> instances = new HashMap<>();
    
    private Singleton() {
        // 私有构造函数
    }
    
    public static Singleton getInstance(String name) {
        if (!instances.containsKey(name)) {
            instances.put(name, new Singleton());
        }
        return instances.get(name);
    }
}

三、使用场景

单例模式通常在需要确保全局只有一个实例的场景中使用,例如:

  1. 线程池:在多线程环境下,线程池需要保证只有一个实例。
  2. 数据库连接池:同样地,数据库连接池也需要保证只有一个实例。
  3. 日志对象:日志对象通常是全局可见的,因此需要保证只有一个实例。
  4. 配置文件:在某些情况下,需要全局共享的配置文件也需要保证只有一个实例。

四、使用示例

下面是一个简单的例子,演示如何使用单例模式实现线程池:

public class ThreadPool {
    private static ThreadPool instance;
    
    private ThreadPool() {
        // 初始化线程池
    }
    
    public static synchronized ThreadPool getInstance() {
        if (instance == null) {
            instance = new ThreadPool();
        }
        return instance;
    }
    
    // 线程池相关的方法
}

在上述代码中,我们使用synchronized关键字来保证getInstance()方法的线程安全性。这意味着每次只有一个线程可以访问getInstance()方法,从而避免了多个线程同时创建线程池实例的问题。

四、常见问题

单例模式的实现有一些常见问题,需要注意:

  1. 线程安全性:如上所述,如果多个线程同时访问getInstance()方法,可能会导致多个实例的创建。因此,需要确保getInstance()方法是线程安全的,可以通过synchronized关键字来实现。
  2. 序列化问题:如果单例类实现了Serializable接口,那么在反序列化时可能会创建多个实例。解决方法是在类中添加readResolve()方法,并返回单例实例。
  3. 反射问题:通过反射机制,可以调用私有构造函数创建实例。解决方法是在构造函数中添加判断,如果已经存在实例则抛出异常

五、总结

单例模式是一种非常常用的设计模式,在多线程环境下,它可以确保只有一个实例被创建,并提供一种全局访问这个实例的方式。在Java中,可以通过私有构造函数和静态方法实现单例模式。在实现单例模式时,需要注意线程安全性、序列化问题以及反射问题。尽管单例模式非常有用,但也有一些缺点,例如它可能导致代码变得更加复杂,而且在多线程环境下可能会影响性能。因此,在使用单例模式时需要根据具体情况进行权衡。文章来源地址https://www.toymoban.com/news/detail-428104.html

到了这里,关于Java设计模式-单例模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA设计模式——单例模式

    单例模式是应用最广的设计模式之一,也是程序员最熟悉的一个设计模式,使用单例模式的类必须保证只能有创建一个对象。 今天主要是回顾一下单例模式,主要是想搞懂以下几个问题 为什么要使用单例? 如何实现一个单例? 单例存在哪些问题? 单例对象的作用域的范围

    2024年02月16日
    浏览(29)
  • Java设计模式---单例 工厂 代理模式

    单例模式是设计模式中的一种,属于创建型模式。在软件工程中,单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于那些需要频繁实例化然后引用,且创建新实例的开销较大的类,例如数据库连接池、缓存管理等。 意图 :保证一个类仅有一个实例

    2024年01月24日
    浏览(36)
  • 设计模式篇(Java):单例模式

    上一篇:设计模式篇(Java):前言(UML类图、七大原则) 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。 构造器私有化 (防止 new ) 类的内部创建对象 向外暴露一个静

    2024年02月11日
    浏览(44)
  • java设计模式-单例

    单例模式是一种创建型设计模式,它可以保证一个类只有一个实例,并提供全局访问点。单例模式在实际开发中经常使用,可以避免多个实例引起的资源浪费和同步问题。常见的java实现方式有多种。 饿汉式单例模式是指在类加载时就创建了单例对象,因此在调用时不需要再

    2024年01月18日
    浏览(39)
  • Java设计模式之单例模式

    定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 想确保任何情况下都绝对只有一个实例 例如:线程池,数据库连接池一般都为单例模式 单例模式优点 在内存中只有一个实例,减少内存开销 可以避免对资源的多重占用 设置全局访问点,严格控制访问

    2024年02月02日
    浏览(54)
  • Java设计模式(八)— 单例模式3

    单例模式之静态内部类 单例模式之枚举方式 单例模式之JDK源码分析 Hello,小伙伴们,欢迎来到柚子的博客~让我们一起成长吧o( ̄▽ ̄)ブ 提示:以下是本篇文章正文内容,下面案例可供参考 代码如下(示例): 类被装载的时候,类里面的静态内部类也是会被装载的,而且线

    2024年02月09日
    浏览(36)
  • java设计模式-单例模式(Singleton)

    单例模式(Singleton)就是一个类只能有一个实例,自行实例化,并向系统提供这一实例,这个类就是单例类。单例模式的特点: 一个类只能有一个实例; 单例类自己实例化; 单例类给其它对象提供这个单一实例。 资源管理类经常被设计为单例模式,例如管理属性文件的类。

    2024年02月15日
    浏览(29)
  • Java与设计模式(4):单例模式

    单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供全局访问点来访问该实例。 在单例模式中,类的构造函数被私有化,从而禁止外部直接实例化该类。通过一个静态方法或静态变量来控制类的实例化过程,并返回同一个实例。 单例模式的特点包括: 单一

    2024年02月12日
    浏览(53)
  • 03-JAVA设计模式-单例模式详解

    单例模式(Singleton Pattern)是设计模式中的一种,它确保一个类仅有一个实例,并提供一个全局访问点来访问该实例。这种设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 单例模式的应用场景十分广泛,主要涉及需要频繁使用某个对象而又不想重复创建的情况

    2024年04月13日
    浏览(43)
  • Java——单例设计模式

    设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我们用不同的棋谱、“套路”。 经典的设计模式共有23种。每个设计模式均是特定环境下特定问题的

    2024年02月11日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包