Java设计模式——单例设计模式
Posted Summer-夏天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式——单例设计模式相关的知识,希望对你有一定的参考价值。
我们一般在学习的第一个设计模式都是单例设计模式,因为单例设计模式广泛的应用在我们程序开发中。今天就和大家简单的聊一聊单例设计模式,因为在我们刚开始学习Java基础时,就了解了单例,有的同学在学习时非常困惑,不明白什么是单例,不明白在什么场景下会用到单例设计模式。
我们先说一下单例的概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
通过概念我们可以简单的知道,所谓的单例模式就是保证我们定义的类在我们的程序中只能new出一个对像(实例)。在一些特定情况下,我们只允许类只能实例化一次,这种情况下我们就需要用到了单例设计模式。
说了这么多,我们写一个初级的单例给大家展示一下:
Class Single
private static Single instance;
Private Singleton()
Public static Single getInstance()
If(instance == null)
Instance = new Single();
Return instance;
大家可以看到,我们是如何保证这个类只能被实例化一次的,首先1、我们对它的构造函数进行私有化,确保外部的类不能对他进行实例化。2、提供一个静态方法来获取当前类对象。
如果外部类想访问这个类对象,我们可以通过类名.getInstance()的方法来获取Single的类对象。
单例设计模式又分为两种,饱汉式和饿汉式。
饱汉式:
/**
* 饱汉式(懒汉式)----就是有钱,豪,用的时候再new(线程不安全)
*/
public class Single1
//这个就不能加final,因为要在其他地方给他再次赋值呢。
//加了final,那就默认一直是null啦,而且还不能再次给此属性赋值。
//此属性是静态,那么就是共享数据,多线程并发操作共享数据是有可能的。那么就会出现下面的线程不安全现象。
Priavte Single1
private static Single1 SingleInstance;
private Singlet1()
public static Single1 getSingleInstance()
if (SingleInstance == null)
//在这个地方,多线程的时候,
//可能A线程挂起,此属性还是null,那么B线程可能也判断条件OK也进来啦。
//然后A线程可以执行的时候就会new个对象,线程B也会new个对象。
//就不能保证内存的唯一性。也就是线程不安全
SingleInstance = new Single1();
return SingleInstance;
饿汉式:
public class Single2
//有的会加final修饰符(更为严谨),添加final修饰符之后,指向的引用不能再做更改。
//这是final的用法:final成员变量表示常量,只能被赋值一次,赋值后值不能再改变。
//这句话得这么理解:
//对于一个final变量。
// 如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;
// 如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
private static final Single2 SingleInstance = new Single2();
private Single2()
public static Single2 getSingleInstance()
return SingleInstance;
Good luck!
Write by Jimmy.li
以上是关于Java设计模式——单例设计模式的主要内容,如果未能解决你的问题,请参考以下文章