`
20386053
  • 浏览: 461473 次
文章分类
社区版块
存档分类
最新评论

【设计模式】单例设计模式的N中Java实现方法

 
阅读更多

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17359719

特点

单例模式的特点:

1、只能有一个实例;

2、必须自己创建自己的一个实例;

3、必须给所有其他对象提供这一实例。

饿汉式单例模式

也称为预先加载法,实现方式如下:

class Single 
{
	private Single()(
		Syustem.out.println("ok");
	)
	private static Single instance = new Single();

	public static Single getInstance(){
		return instance;
	}
}

优点:线程安全,调用时反应速度快,在类加载的同时已经创建好了一个静态对象;

缺点:资源利用效率不高,可能该实例并不需要,但也被系统加载了

懒汉式单例模式

也称为延迟加载法,实现方式如下:

public class LazySingleton {
    private static LazySingleton instance;    
    private LazySingleton() {}
    
    public static LazySingleton getInstance() {             
		if (instance == null) {                       
			instance = new LazySingleton();           
		}
        return instance;                                      
    }
}

延迟加载法在适用于单线程环境,它不是线程安全的,引入多线程时,就必须通过同步来保护getInstance()方法,否则可能会返回LazySingleton的两个不同实例。比如,一个线程在判断instance为null后,还没来得及创建新的instance,另一个线程此时也判断到instance为null,这样两个线程便会创建两个LazySingleton实例。

可以将getInstance()方法改为同步方法,这样便可以避免上述问题,改进后的单例模式实现如下:

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

优点:资源利用率高,不执行getInstance就不会被实例。

缺点:第一次加载时反应不快,多线程使用不必要的同步开销大

这里的缺点主要是:每次调用getInstance()方法时,都要同步,而且很多时候的同步是没必要的,这将会极大地拖垮性能(尤其在需要多次调用getInstance方法的地方)。

DCL单例模式

针对延迟加载法的同步实现所产生的性能低的问题,我们可以采用DCL,即双重检查加锁(Double Check Lock)的方法来避免每次调用getInstance()方法时都同步。实现方式如下:

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

优点:资源利用率高,不执行getInstance就不会被实例,多线程下效率高。

缺点:第一次加载时反应不快,由于java 内存模型一些原因偶尔会失败,在高并发环境下也有一定的缺陷,虽然发生概率很小。

static内部类单例模式

该方法是为了解决DCL方法在并发环境中的缺陷而提出的,关于DCL在并发编程中存在的问题可以参考这篇文章:http://blog.csdn.net/ns_code/article/details/17348313的后半部分,其实现方式如下:

class Single 
{
	private Single()(
		Syustem.out.println("ok");
	)
	
	private static class InstanceHolder{
		private static final Singlet instance = new Single();
	}

	public static Single getInstance(){
		return InstanceHolder.instance;
	}
}

优点:线程安全,资源利用率高,不执行getInstance就不会被实例。

缺点:第一次加载时反应不快。

这里针对最后一种方法补充以下基本知识点:类级内部类(有static修饰的成员内部类)相当于其外部类的成员,只有在第一次使用时才会被装载,而不会在类加载器加载其外部类的时候被装载,而且只会被加载一次。因此,资源利用率高。

总结:在Java中由于会涉及到并发编程,考虑到效率、安全性等问题,一般常用饿汉式单例模式或static内部类单例模式,二者优缺点刚好颠倒过来,因此要根据具体情况来使用。

参考资料:http://blog.csdn.net/ns_code/article/details/17348313

http://write.blog.csdn.net/postlist/0/all/draft

http://www.myexception.cn/software-architecture-design/1235112.html

http://m.blog.csdn.net/blog/codezjx/8883599

http://blog.sina.com.cn/s/blog_6d2890600101gb8x.html

分享到:
评论

相关推荐

    java23种设计模式

    java23种设计模式,每一种模式都有详细的讲解,很全面,如果你想深入了解一下java23种设计模式,这会非常适合你的哦!上传乃为百度云连接,失效请留言。 内容: 001策略模式! N. B8 ~' D! f9 j+ g0 I 002观察者模式 ...

    Java中单态设计模式

    ### Java中单态设计模式详解 #### 一、引言 设计模式是在长期软件开发过程中提炼出来的最佳实践,它们提供了一种标准化的方式用于解决特定类型的问题。对于Java开发者而言,熟悉并掌握各种设计模式是非常重要的,...

    二十三种设计模式【PDF版】

    设计模式之 Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. ...

    C语言-设计模式汇总,包含23中常见设计模式,利用C语言实现;

    设计模式不仅限于C++或Java,它们的核心是解决问题的策略,因此在C语言中也可以应用。虽然C语言缺乏内置的面向对象特性,但通过巧妙的结构体和函数组合,可以实现类似的设计模式。重要的是理解每个模式背后的意图,...

    Java8新特性与设计模式.zip

    设计模式方面,Java 8的新特性为许多经典设计模式提供了新的实现方式,如使用Stream API实现迭代器模式,使用Lambda表达式替换策略模式中的接口实现,使用Optional改进单例模式以防止空指针异常等。理解这些新特性和...

    Java软件设计模式[最详尽=面向对象+编程原则+设计模式].rar

    Java软件设计模式是一种在开发过程中遵循的一套最佳实践和通用解决方案,它可以帮助开发者解决常见的编程问题,提高代码的可读性、可维护性和复用性。面向对象编程原则是设计模式的基础,它包括封装、继承和多态等...

    Java多例设计模式实例详解

    Java多例设计模式是一种特殊的设计模式,旨在解决单例模式中存在的缺陷。单例模式只能存在一个对象实例,而多例设计模式允许存在多个对象实例,并且每个对象实例都可以独立地供外部应用使用。 一、多例设计模式定义...

    用回溯法实现n皇后问题(java源码)

    在编程领域,n皇后问题是一个经典的算法问题,它要求在n×n的棋盘上放置n个皇后,使得任意两个皇后不能...通过Java实现的n皇后问题源码,我们可以深入学习到回溯法、数据结构、设计模式以及软件工程中的许多重要概念。

    设计模式实验-Java代码类资源

    实现单例模式,组合模式,Builder模式,装饰器模式,并使用设计模式实现赌场

    Java面试宝典(设计模式,算法,Linux篇)

    ### 单例设计模式 **单例模式**是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。其特点包括: 1. **单一实例**:确保类仅有一个实例。 2. **自我创建**:由单例类自己创建和管理这个...

    Java私塾Java

    学习单例、工厂、观察者、装饰者等经典设计模式,能提升代码质量和可扩展性。 10. **框架应用**:在Java私塾的高级部分,可能会涉及Spring、MyBatis等流行框架的使用。这些框架简化了开发流程,提高了开发效率,...

    剑指Offer题目Java实现代码

    这个压缩包中的"src"目录很可能包含了书中的各种Java实现代码,涵盖了数据结构、算法、设计模式等多个IT领域的知识点。 1. **数据结构** - **数组**:基础的数据结构,Java中的数组可以用来存储同类型元素的集合。...

    PHP常见设计模式详解

    虽然很多人误以为设计模式是专门为Java架构师准备的高级技巧,但实际上,无论何种语言背景的开发者都能从中受益匪浅。尤其在PHP这种广泛应用于Web开发的语言中,合理运用设计模式可以显著提高代码质量,促进软件的可...

    fft.rar_fft_fft java_java fft_java 中的 fft_java实现fft程序

    这是最常见的FFT算法,也是Java中实现的基本方法。分为 radix-2(基2)和 arbitrary radix(任意基)两种。Java中通常实现radix-2,因为它对序列长度有特定要求(必须为2的幂)。 5. **Java代码实现** - 初始化:...

    java毕业设计-基于JAVA CS远程监控系统软件的实现(源代码+论文).zip

    7. **设计模式**:如单例模式、工厂模式等设计模式可能被应用于系统设计中,提高代码的可维护性和可扩展性。 8. **安全性**:考虑到远程监控系统涉及的数据敏感性,安全措施如加密传输、身份验证等也是必须考虑的。...

    java设计的两本图书

    此外,书中可能也提到了设计模式,如工厂模式、单例模式、装饰器模式等,这些都是提高代码可复用性的重要工具。 其次,"面向对象的设计原则-类设计原则.pdf"这本书专注于面向对象的设计原则,这些原则是所有OOP...

    java项目参考源码

    2. **异常处理**:Java中的异常处理机制是通过try-catch-finally语句实现的,源码中可以看到如何有效地捕获和处理运行时错误。 3. **集合框架**:Java集合框架包括ArrayList、LinkedList、HashMap等,源码可以展示...

    金字塔java入门程序

    8. **设计模式**:设计模式是解决常见编程问题的模板,比如单例模式、工厂模式等。虽然不是Java语言本身的一部分,但熟悉它们能帮助写出可维护、可扩展的代码。 9. **Java API**:Java标准库(Java API)提供了丰富...

    基于java的超市综合管理信息项目设计与实现(项目报告+源代码+翻译).zip

    7. **设计模式**:项目可能运用了工厂模式、单例模式、策略模式等设计模式,以提高代码的可读性、可维护性和复用性。 8. **多层架构**:项目可能采用了三层架构(表示层、业务逻辑层、数据访问层),各层职责明确,...

Global site tag (gtag.js) - Google Analytics