JAVA单例模式分析及其实现:饿汉式、懒汉式、双重检查、静态内部类

本文介绍了Java中的单例模式,包括其概念、实现基础和六种实现方式:饿汉式(静态成员、静态代码块)、懒汉式(线程不安全、线程安全、双重检查)以及静态内部类实现。单例模式确保类只有一个实例,并提供全局访问点。文章详细分析了各种实现的优缺点,特别强调了线程安全和懒加载的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式是什么

首先,单例模式是设计模式的一种,是对类的编写的一种模式规范。具体到单例模式,

通俗说,例就是实例,就是对象;单就是一,代表唯一。所以说,单例模式,就是该类仅能有一个实例化对象的设计模式。

较全面的说,单例模式即使保证在整个应用程序的生命周期中的任意时刻,单例模式类的实例都只存在不超过一个(一个或者不存在)。

单例模式实现基础

知道了单例模式的基本含义,接着需要探讨实现单例类的基础,也就是怎样的设计可以实现这样的模式。

可参考如下对单例类的描述:单例模式在类中保存了它唯一的实例,同时它还提供了一个访问该唯一实例的全局方法。

在该描述中,我们获得了以下要点:

  • 单例类在内部保留了它唯一的实例
  • 单例类向外界提供了访问这个唯一实例的全局方法

就这两点方法,我们便可以展开分析(事实上,下文不同的写法也正是围绕着这两点进行修正。):

内部保留唯一实例

这个要点实际上需要完成两点:
1.外部不能进行实例化。
2.内部需要实例化一个私有对象

第一点,外部不能对该类进行实例化,是单例类唯一实例的根本保证。那么让外界不能对一个类进行实例化,可以采取的一种设计是让外界在进行实例化时无法调用构造方法,即将构造方法定义为私有。这样一来外部便不能在new后调用与类同名的构造方法产生实例。消除外部实例化可能性,完成!

第二点,单例类内部需要有一个实例化对象。对于这个对象,由于这个对象被类所独有,所以对象访问级别为私有;由于该类不能在外部产生对象,所以作为成员的这个对象不能是一般的成员变量,它必须为静态变量

综上,解决这两点问题,需要
1.单例类的构造方法需要为私有
2.单例类内需要包含一个该类的静态私有变量

(对于静态内部类的写法,可将成员变量放入内部静态类中)

提供全局方法获得实例

这里,同样是由于该类不能被外部实例化对象,所以刚方法仅能通过类直接访问。所以,该方法应该是静态全局的,同时返回类型为该单例类类型
(笔者个人理解:由于涉及到线程安全和多线程下的效率问题,不同的实现方法主要就在这获得实例上斗智斗勇。)

实现单例模式

单例类的实现方法有很多。这里,仅列举六种写法:

1.饿汉式写法,静态成员变量
/*单例模式,饿汉式写法1-静态常量*/

public class Singleton1 {
   
   
	private static Singleton1 uniqueInstance = new Singleton1();
	
	private Singleton1(){
   
   }
	
	public static Singleton1 getInstance()
	{
   
   
		return uniqueInstance;
	}
}

最基本的写法,在定义静态常量同时完成实例化,获得对

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值