Java 24 Design Pattern 之 单例模式

本文详细介绍了Java中的单例模式,包括其概念、使用场景和UML类图。重点讨论了单例模式的实现,包括懒汉式和饿汉式,并分析了它们的线程安全性和性能优缺点。此外,文章还提到了volatile关键字在单例模式中的作用,以及并发测试的示例。
摘要由CSDN通过智能技术生成

单例模式介绍

概述

使用场景

UML类图 

单例模式实现

单例模式实现要点

单例两种模式

懒汉式

饿汉式


单例模式介绍

概述

单例模式:某一个类在系统中只需要有一个实例对象,而且对象是由这个类自行实例化并提供给系统其它地方使用,这个类称为单例类。单例模式是GOF 23种设计模式中最简单的一种,但同时也是在项目中接触最多的一种。单例模式属于一种创建型设计模式。

使用场景

大家都使用过Windows任务管理器,正常情况下,无论我们在Windows任务栏的右键菜单上点击启动多少次“任务管理器”,系统始终只能弹出一个任务管理器窗口。也就是说,在一个Windows系统中,系统只维护一个任务管理器。这就是一个典型的单例模式运用。

再举一个例子,网站的计数器,一般也是采用单例模式实现,如果你存在多个计数器,每一个用户的访问都刷新计数器的值,这样的话你的实计数的值是难以同步的。但是如果采用单例模式实现就不会存在这样的问题,而且还可以避免线程安全问题。同样多线程的线程池的设计一般也是采用单例模式,这是由于线程池需要方便对池中的线程进行控制。

可以看出,我们在程序中使用单例模式,目的一般是处理资源访问的冲突,或者从业务概念上,有些数据在系统中只应保存一份,那也比较适合设计为单例类,比如配置类、全局流水号生成器等。

UML类图 

单例模式实现

单例模式实现要点

单例模式虽然简单,但是要写出一个能保证在多线程环境下也能保证实例唯一性的单例确不是那么简单,实现一个正确的单例模式有以下几个要点:

  • • 1.某个类只能有一个实例,即使是多线程运行环境下;

  • • 2.单例类的实例一定是单例类自身创建,而不是在单例类外部用其它方式如new方式创建;

  • • 3.单例类需要提供一个方法向整个系统提供这个实例对象。

单例两种模式

单例模式分为饿汉模式和懒汉模式,这两种模式很好理解,懒汉模式的意思就是这个类很懒,只要别人不找它要实例,它都懒得创建。饿汉模式在初始化时,我们就创建了唯一的实例,即便这个实例后面并不会被使用。

下面分别介绍两种单例模式的写法。

懒汉式

下面这种写法的单例是大家最简单最容易写出的一种单例写法,只适用于单线程的系统,也就是说它不是线程安全的。

//懒汉式,线程不安全
 class Singleton1{
     private static  Singleton1 instance;

     //构造函数定义为私有,防止外部创建实例
     private Singleton1(){

     }

     //系统使用单例的入口
     public static Singleton1 getInstance(){
         if (null == instance){
             instance = new Singleton1();
         }

         return instance;
     }
 }

针对线程不安全的问题,可以通过获取实例的方法添加了synchronized来解决,如下:

//懒汉式,线程安全,效率低
class Singleton2{
    private static  Singleton2 instance;

    //构造函数定义为私有,防
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

time Friend

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值