Singleton(单例)模式

  • 单例的实现

Singleton单例模式的宗旨在于确保某个类只有一个实例,并且为之提供一个全局访问点。 该模式通常被用来代表那些本质上具有唯一性的系统组件,比如视频显示或者文件系统。

实现单例一般有两种方法。这两种方法都要把构造函数保持为私有,并且提供一个静态成员,以便允许客户能够访问该系统唯一的实例。

方法一:将公有成员设定为一个final域,如下所示(假设存在一个Test类):


私有构造函数仅被调用一次,用来实例化公有的静态final域Test.INSTANCE。由于缺少公有的或者受保护的构造函数,所以保证了Test的全局唯一性。

使用该方法的好处在于组成类的成员的声明很清楚地表明该类是一个Singleton:公有的静态域是final的,所以该域总是包含相同的对象引用。该方法在性能上具有优势。

方法二:提供一个公有的静态工厂方法,而非公有的静态final域。如下所示:


第二种方法的主要好处在于,它提供了灵活性:在不改变API的前提下,允许我们改变想法,将该类设计为单例,或者不设计成单例。

如果不希望提前创建单例对象,我们可以等到第一次使用该单例对象的时候在创建它,即延迟初始化。如下所示:


  • 单例与线程:

在多线程环境中,我们无法保证一个方法能够持续运行到结束,其他线程的方法才能开始运行。如果要在多线程环境中对单例采用延迟初始化,那么我们必须小心防止多个线程同时初始化。如果要确保只有一个线程可以初始化单例类,我们可以利用锁机制对单例初始化进行同步,所选取的所可以使用属于当前类的所进行同步。

如下所示:


getInstance()的代码保证:在一个线程开始延迟初始化的时候,如果有另一个线程也准备开始初始化,第二个线程将停止执行,等待获取对象classLock的锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值