单例模式是一种常见的设计模式,它确保一个类只有一个实例,并提供全局访问点。实现单例模式的方式有两种:懒汉式和饿汉式。懒汉式在第一次调用时创建实例,而饿汉式在类加载时就创建了实例。本文深入理解并实现了这两种方式的单例模式,帮助读者更好地理解和掌握这一重要设计模式。
单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点,这种模式通常用于那些需要频繁创建和销毁的对象,例如数据库连接、线程池等。
单例模式的实现主要有以下几种方式:
1、懒汉式-线程安全:这种方式是最常用的,也是最简单的,在第一次调用getInstance()方法时才创建实例,这样可以延迟加载,节省资源,这种方式在多线程环境下可能会出现问题,因为如果两个线程同时调用getInstance()方法,可能会创建两个实例,为了解决这个问题,我们可以使用synchronized关键字来确保线程安全。
2、饿汉式-线程安全:这种方式是在类加载时就创建实例,所以不存在延迟加载的问题,这种方式会浪费资源,如果实例没有被使用,就会造成内存浪费,为了保证线程安全,我们同样可以使用synchronized关键字。
3、双重校验锁(DCL,即double-checked locking):这种方式结合了懒汉式和饿汉式的优点,既实现了延迟加载,又保证了线程安全,在getInstance()方法中,我们先检查实例是否已经创建,如果没有创建,再进行同步,这样,只有第一次调用getInstance()方法时,才会进行同步,从而提高了效率。
4、静态内部类:这种方式也实现了延迟加载,并且保证了线程安全,这是因为静态内部类只有在被调用时才会加载,并且加载时不会加锁,静态内部类不会与其他类共享实例,所以也不存在线程安全问题。
5、枚举:这种方式是JDK 5引入的,它不仅能实现延迟加载,而且保证了线程安全,因为枚举类型是单例的,所以我们可以把它们当作单例来使用,这种方式的优点是简洁,缺点是不能继承其他类。
就是单例模式的实现方式,每种方式都有其优点和缺点,我们需要根据实际情况选择合适的方式。