`

单件模式

阅读更多

单件模式:确保一个类只有一个实例,并提供一个全局访问点。

package com.ez.biz;
/**
 * 单件模式,
 * @author 窗外赏雪(EZ编程网)
 */
public class Singleton {
	//利用一个私有静态变量记录类的唯一实例
	private static Singleton uniqueInstance;
	
	//私有构造方法,只有类内部才能调用构造方法
	private Singleton(){}
	//全局访问点
	public static Singleton getInstance(){
		//延迟实例化
		if(uniqueInstance == null){
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
}

 

单件模式利用Java静态变量也可以做到,但是有以下缺点:

如果将对象赋给一个全局变量,那么你必须在程序一开始就创建好对象。

万一这个对象非常耗费资源,程序在这次的执行中,又没用到它,就会形成浪费了。

单件模式可以延迟实例化。

 

park停车场,当位置满的时候,就不让车辆进入。

package com.ez.biz;
/**
 * 车进入停车场时,判断车位是否有空余。
 * @author 窗外赏雪(EZ编程网)
 */
public class Park {
	//停车场一共20个车位
	private int carports = 20;
	
	//私有静态变量,记录类的唯一实例
	private static Park uniquePark;
	
	//全局访问点
	public static Park getInstance(){
		if(uniquePark==null){
			uniquePark=new Park();
		}
		return uniquePark;
	}
	
	//私有构造方法
	private Park(){}
	
	//车辆进入
	public void enter(){
		if(carports>0){
			carports--;
		}else{
			System.out.println("车位已满");
		}
	}
	
}

 

在多线程的情况下,会导致车位已经满了,但是车辆还可以进入。

 

多线程下,单件模式的处理。

把全局入口getInstance()变成同步,多线程问题就可以解决。

//全局访问点
	public static synchronized Park getInstance(){
		if(uniquePark==null){
			uniquePark=new Park();
		}
		return uniquePark;
	}

 一旦设置好uniqueInstance变量,就不再需要同步这个方法了。

 很明显,我们需要确保单件模式能在多线程的状况下正常工作,而同步getInstance()的做法将拖垮性能。

 

第一种做法:

private static Park uniqueInstance = new Park();

在静态初始化器中创建单件。这段代码保证了线程安全。

我们依赖JVM在加载这个类时,马上创建此唯一的单件实例。

JVM保证在任何线程访问uniqueInstance静态变量之前,一定先创建此实例。

 

第二种做法:

利用“双重检查加锁”,先检查实例是否已经创建,如果还没有创建,才进行同步。这样,只有第一次才会同步。

package com.ez.biz;

/**
 * 车进入停车场时,判断车位是否有空余。
 * @author 窗外赏雪(EZ编程网)
 */
public class Park {

	// 私有静态变量,记录类的唯一实例  vloatile
	private volatile static Park uniquePark;

	// 全局访问点
	public static Park getInstance() {
		if (uniquePark == null) {
			synchronized (Park.class) {
				if (uniquePark == null) {	//进入区块后,再检查一次
					uniquePark = new Park();
				}
			}
		}
		return uniquePark;
	}

}

 

 

分享到:
评论

相关推荐

    设计模式 单件模式 设计模式 单件模式

    "设计模式-单件模式" 单件模式是指确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享的程序设计方法。单件模式是一种非常实用的设计模式,它可以控制一个类的实例数量,使得调用者可以从...

    设计模式 之 单件模式

    单件模式(Singleton Pattern)是设计模式中的一种,它的核心意图是确保一个类只有一个实例,并提供一个全局访问点。在软件工程中,这样的设计模式能够有效地控制资源的使用,限制实例的数量,以及协调对象间的交互...

    c++实现单件模式 c++实现单件模式 c++实现单件模式

    单件模式(Singleton Pattern)是设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在软件开发中被广泛应用,比如配置管理、数据库连接池、日志服务等场景,需要确保全系统...

    单件模式试做--static的使用

    单件模式(Singleton Pattern)是设计模式中的一种结构型模式,它的主要目的是保证一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,例如日志服务、线程池、数据库连接等...

    C#单件模式例子 内含C#编写源代码

    单件模式(Singleton Pattern)是设计模式中的一种结构型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在C#编程中,单例模式被广泛应用于那些需要频繁创建和销毁的对象,比如线程池、数据库...

    基于C#的设计模式中的单件模式

    单件模式(Singleton Pattern)是软件设计模式中的一种基础模式,它确保一个类只有一个实例,并提供一个全局访问点。在C#中,单例模式的实现有多种方式,包括懒汉式、饿汉式以及线程安全的实现。下面我们将详细讨论...

    单件模式 实例 模式 很好的例子

    模式 很好的例子模式 很好的例子模式 很好的例子模式 很好的例子模式 很好的例子设计模式的一 种单件 模式 很好的例子

    用单件模式写的写日志文件(VC版)

    单件模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C++编程中,单件模式通常用于管理共享资源,比如日志系统,因为它需要在整个应用程序中被多个组件访问,...

    数据库连接-单件模式

    尽管文件列表中提到了`MySQL`,但在“数据库连接-单件模式”的主题下,我们通常讨论的是如何在SQL Server环境下应用单例模式。不过,单例模式的概念和实现方式在MySQL或其他数据库系统中也是类似的,只是具体的...

    工厂方法和单件模式结合示例

    工厂方法和单件模式结合示例DEMO,语言C#.

    单件模式——C++实现(单一头文件)

    用c++实现的单件模式 单一头文件 直接继承可用

    单件模式详解单件模式详解

    单件模式详解单件模式详解单件模式详解单件模式详解单件模式详解单件模式详解单件模式详解

    设计模式之单件模式

    这份文档以例子的形式讲诉了设计模式之单件模式,希望可以帮助学习的人!

    深入浅出设计模式之单件模式

    ### 深入浅出设计模式之单件模式 #### 一、单件模式概述 单件模式(Singleton Pattern)是软件设计模式中最为常见的一种,它的主要目标是确保某个类只有一个实例,并提供一个全局访问点。单件模式在很多情况下都...

    单件模式(Single Pattern)

    单件模式(Single Pattern),C#的实现代码。根据不同需求的5种实现方式。

    单件模式实例

    单件模式实例,有极大的参考价值

    C#设计模式,单件模式,C#代码

    C#作为.NET框架的主要编程语言,广泛应用于各种复杂系统开发,其中单件模式(Singleton Pattern)是C#开发者经常会遇到的一种设计模式。本资源旨在帮助初学者理解并应用单件模式,通过关键代码实例,让你快速掌握这...

    设计模式_--_工厂模式和单件模式

    ### 设计模式——工厂模式与单例模式 #### 一、引言 设计模式是软件工程领域中的一个重要概念,它代表了在特定情况下解决常见问题的最佳实践。在本篇文章中,我们将深入探讨两种广泛使用的软件设计模式:工厂模式...

    单件模式源代码

    单件模式(Singleton Pattern)是软件设计模式中最基础且常用的一种模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要控制实例化过程或者资源管理的场景中尤其适用,例如日志服务...

Global site tag (gtag.js) - Google Analytics