单例模式是一种常用的软件设计模式,它保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式有两种实现方式:懒汉式和饿汉式。懒汉式在第一次调用时实例化对象,而饿汉式在类加载时就实例化对象。这两种方式各有优缺点,需要根据实际情况选择使用。
本文目录导读:
在计算机编程领域,单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点,这种模式在很多场景下都非常有用,例如数据库连接、日志记录等,本文将详细介绍单例模式的概念、实现方式以及优缺点,并通过实际案例来演示如何在编程中应用单例模式。
单例模式的概念
单例模式是一种创建型设计模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点,这种模式的实现通常包括以下几个步骤:
1、定义一个私有静态成员变量,用于存储唯一的实例;
2、提供一个公共静态方法,用于获取该实例;
3、在私有构造函数中,对唯一的实例进行初始化操作;
4、如果需要,可以提供一个私有构造函数,用于防止外部直接创建实例。
单例模式的实现方式
下面我们来看一下几种常见的单例模式实现方式:
1、懒汉式(线程不安全):
public class Singleton { private static Singleton instance; public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
这种实现方式是在第一次调用getInstance()方法时才创建实例,因此被称为懒汉式,这种方式在多线程环境下是不安全的,因为多个线程可能同时调用getInstance()方法,导致实例被重复创建。
2、懒汉式(线程安全,同步方法):
public class Singleton { private static volatile Singleton instance; public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
为了解决懒汉式线程不安全的问题,我们可以使用synchronized关键字对getInstance()方法进行同步,这样一来,只有获得锁的线程才能进入临界区,从而确保实例的唯一性,这种方式会降低程序的性能,因为每次调用getInstance()方法都需要进行同步。
3、饿汉式(线程安全):
public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }
饿汉式是在类加载时就完成了实例的创建,因此不需要考虑多线程环境,由于实例在类加载时就被创建,所以饿汉式是线程安全的,这种方式会导致实例在未被使用时就被创建,增加了系统资源的浪费。
4、双重检查锁定(推荐):
public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }