`
Col.Man
  • 浏览: 19026 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java单例模式

阅读更多

单例模式

     单例模式是开发中属于经常用到的模式之一也是相对比较简单的,单例顾名思义即在应用中始终存在一个实例这也对应了其特点:

  •  单例类只能有一个类。
  • 自己创建自身的唯一实例。
  • 将自身提供给所有其它类。
 单例模式主要分为以下几种写法,不同的写法有着不同的说法,下面我们一起来看下

首先是简单单例写法,即在初始化类的时候创建了实例。

 

/**
 * 
 * @author Col.Man
 *  <p>  简单单例模式  </p>
 */
public class Singleton {
	private static Singleton instance = new Singleton();
	 
	public static Singleton getInstance() {
		return instance;
	}
	private Singleton() { 
	     
	} 
}
   当类被加载上静态变量instance将被初始化,此时的私有构造函数被调用,创建Singleton的唯一实例。
	private static Singleton instance = new Singleton();
     此种写法是典型的拿空间换时间,在类加载时即创建,不管你用不用,每次使用时不用做判断节省了运行时间,假如创建这个对象需要耗费大量的空间且创建后不予是使用,那岂不是浪费,况且在单例模式中一般都是通过getInstance()来触发类加载,显然这种不是很理想,也没达到懒加载的效果。
那么就引出来简单单例模式的进化版lazy loaded
public class Singleton {
	private static Singleton instance =null;

	private Singleton() {
	}

	public static Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}
 这种写法lazy loading很明显,但是致命的是在多线程不能正常工作,那么我们来进一步优化
public class Singleton {
	private static Singleton instance =null;

	private Singleton() {
	}

	public static synchronized Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}
 
 这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是效率很低,大多数情况下不需要同步,那么这种写法还需要进一步优化;
       我们来分析下加锁的范围,是需要整个方法都要加锁还是某一个语句加锁就可以了,检测null和创建对象的分离的,如果两个操作能原子的操作那么就达到单例的效果,于是修改代码
public class Singleton {
	private static Singleton instance = null;

	private Singleton() {
	}

	public static Singleton getInstance() {
		synchronized (Singleton.class) {
			if (instance == null) {
				instance = new Singleton();
			}
		}

		return instance;
	}
}
  从代码上看之前是方法体同步,现在是方法内同步,但还是在调用getInstance()的时候立即同步,性能上没达到什么改进,那么如何进一步优化呢?我们可以想象如果instance==null 时我们在去同步会不好好一些呢,答案是肯定的,当实例生成后instance 就不空,此时判定instance == null 为false就不会进入同步。代码如下
public class Singleton {
	private static Singleton instance = null;

	private Singleton() {
	}

	public static Singleton getInstance() {
		if (instance == null) {
			synchronized (Singleton.class) {
				if (instance == null) {
					instance = new Singleton();
				}
			}
		}
		return instance;
	}
}
 

 这就是double-checked locking设计实现单例模式。其实单例还有很多种写法,比如枚举、静态内部类等,在这里就不一一讲解,文笔不好勿喷...

分享到:
评论

相关推荐

    Java 单例模式.pptx

    ### Java 单例模式详解 #### 一、什么是单例模式? 单例模式是一种常用的软件设计模式,在这种模式中,一个类只能拥有一个实例,并且该类必须自行创建并提供这个实例。通常,单例模式用于确保某个类在整个应用程序...

    java单例模式实例

    在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们来看**懒汉式(Lazy Initialization)**。这种实现方式是在类被首次请求时才创建单例对象,延迟...

    使用Java单例模式实现一个简单的日志记录器.txt

    ### 使用Java单例模式实现一个简单的日志记录器 #### 一、单例模式简介 单例模式是一种常用的软件设计模式,在该模式中,一个类只能创建一个实例,并且提供了一个全局访问点来访问该实例。单例模式的主要优点包括...

    Java 单例模式 懒汉模式

    Java 单例模式 懒汉模式 //懒汉式 多线程中不可以保证是一个对象

    Java 单例模式 工具类

    Java中的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Java编程中,单例模式常用于控制资源的访问,比如数据库连接池、线程池或者日志对象等。本篇文章将深入探讨如何在Java中...

    JAVA单例模式的几种实现方法

    ### JAVA单例模式的几种实现方法 #### 一、饿汉式单例类 饿汉式单例类是在类初始化时就已经完成了实例化的操作。这种实现方式简单且线程安全,因为实例化过程是在编译期间完成的,不会受到多线程的影响。 **代码...

    Java单例模式设计

    Java单例模式是一种常用的设计模式,它保证一个类只有一个实例,并提供全局访问点。这种模式在需要频繁创建和销毁对象的场景中,或者当对象昂贵时(如数据库连接),能够节省系统资源,提高效率。本篇文章将深入探讨...

    java单例模式及实现

    Java单例模式及实现 Java单例模式是一种常见的设计模式,确保某一个类只有一个实例,而且向这个系统提供这个实例。单例模式可以分为三种:懒汉式单例、饿汉式单例、登记式单例。 单例模式的要点 1. 某个类只能有...

    Java单例模式深入理解

    Java单例模式是一种设计模式,它允许在程序中创建唯一一个类实例,通常用于管理共享资源,例如数据库连接、线程池或者配置对象等。单例模式的核心在于限制类的构造函数,确保类只能被初始化一次,从而实现全局唯一的...

    Java单例模式应用研究.pdf

    ### Java单例模式应用研究 #### 一、单例模式概述 单例模式(Singleton Pattern)作为一种最基本的创建型设计模式,其主要目的是控制一个类的实例化过程,确保在整个应用程序中仅存在一个实例,并且该实例能够被全局...

    java单例模式的例子

    Java单例模式是一种常见的设计模式,它在软件工程中用于控制类的实例化过程,确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统资源管理、缓存、日志记录等方面应用广泛。下面我们将深入探讨Java单例...

    java单例模式连接数据库源码

    Java单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在数据库连接管理中,使用单例模式能有效控制资源,避免频繁创建和关闭数据库连接导致的性能损失和资源浪费。以下是对Java单例模式...

    java单例模式代码实例

    Java单例模式是一种常用的设计模式,它用于保证一个类只有一个实例,并提供全局访问点。这种模式在系统资源有限或者需要共享昂贵对象时尤其有用,比如数据库连接池、线程池等。下面我们将深入探讨Java单例模式的实现...

    java 单例模式(懒汉式与饿汉式).docx

    java 单例模式(懒汉式与饿汉式) java 单例模式是一种常用的软件设计模式。在它的可信结构中只包含一个被实例化单例的特别类。通过单例设计模式可以把整系统中的一个类只有一个实例。单例设计模式又分为两种方式,...

    Java单例模式.pdf

    Java单例模式是设计模式中的一种,在软件开发中扮演着重要的角色。单例模式的目的是保证一个类仅有一个实例,并且提供一个全局访问点。在Java中实现单例模式有多种方法,主要包括懒汉式、饿汉式、注册式(使用容器)...

Global site tag (gtag.js) - Google Analytics