`
黑熊精
  • 浏览: 3370 次
社区版块
存档分类
最新评论

单例设计模式的七种方式

阅读更多
单例是一种设计模式,指该类被创建后有且仅有一个实例供外部访问,并且提供一个全局的访问入口。
有三个核心点:
1、类的构造方法私有化
2、内部产生该类的实例化对象,并声明为private static
3、定义一个静态方法返回该类的实例
常见的单例模式有下面几种。
一、饱汉方式
public class Singleton {
	private static Singleton singleton;
	private Singleton(){}
	public static Singleton  getInstance(){
		if(singleton == null){
			singleton = new Singleton ();
		}
		return singleton;
	}
}
该方式不能算真正的单例模式,在多线程环境下根本无法实现单实例。
 
 
二、饱汉-线程安全
public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
 
实现了线程的同步,但是synchronized 的粗暴导致该方式性能低下。
 
三、饿汉方式
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton (){}
public static Singleton getInstance(){
return singleton;
}
}
 
所谓饿汉即一开始就声明示例,是通过类加载的方式避免了多线程同步问题。在类初始化是实例化singleton。
 
四、饿汉-静态代码块
public class Singleton {
private static Singleton singleton;
private Singleton(){}
static{
singleton = new Singleton();
}
public static Singleton getInstance(){
return singleton;
}
}
 
在编码上跟饿汉方式有很大区别,但是实际区别不大,都是在类初始化时候实例化singleton。
 
五、静态内部类
public class Singleton {
private Singleton(){}
private static class SingletonHolder {
private static final Singleton singleton = new Singleton();
}
public static final Singleton getInstance(){
return SingletonHolder.singleton;
}
}
 
该方式也是利用classloader保证単实例,但是跟饿汉模式还是有很大区别的,饿汉是在类初始化时候已经实例化了singleton,但是静态内部类只有在真正调用getInstance()时候才会实例化singleton,故真正意义上实现了懒加载。
 
六、双重校验
public class Singleton {
private volatile  static Singleton singleton ;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null){
synchronized (Singleton.class) {
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
 
该方式是饿汉-线程安全方式的变种,且大大提高了性能。但是请注意写法使用了volatile  关键字,为什么?主要还是跟JVM的制令重排有关系,导致线程获取未完全初始化的实例。
singleton = new Singleton(); 的过程经历了三个步骤。
1、在堆中为Singleton开辟内存空间,分配地址。
2、执行构造函数初始化
3、将内存地址赋值给singleton 。
如果是经过了指令重排后,那么2、3步骤将交换。试想如果在执行完步骤3,还未开始执行2,另外的线程在执行到第一个if判断是,此时的singleton != null,那么将返回一个外完全初始化的singleton。
七、枚举方式
public enum Singleton {
	
	INSTANCE;
	
	private String toDO(){
		return "XXXX";
		
	}
}
关于枚举实现单例,这篇文章解释的很详细http://www.cnblogs.com/ldq2016/p/6627542.html。
就个人而言:
 第一种饱汉模式根本就不能算是单例,三、四基本是一样。五、六很经典。三、五是比较常用的。枚举模式好处还是多多的,就是平时用的很少而已。
 
 

 

分享到:
评论

相关推荐

    Java设计模式之单例模式的七种写法

    Java设计模式之单例模式的七种写法 单例模式是一种常见的设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机的驱动程序对象常...

    单例模式的七种写法

    单例模式是软件设计模式中的一种经典模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制数据库连接、管理缓存或者全局配置等。下面我们将详细探讨单例模式的七种...

    7种单例模式

    单例模式是软件设计模式中的一种经典模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制共享资源、管理配置对象等。下面将详细介绍七种常见的单例模式实现...

    Java:单例模式的七种写法

    免线程同步问题,而且还能防止反序列化重新创建新的对象,绝对的线程安全,同时也能保证单例的唯一性。...同时,单例模式也常常与其他设计模式结合使用,如工厂模式、建造者模式等,以解决更复杂的问题。

    OC单例模式讲解

    单例模式是设计模式中的一种,属于创建型模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Objective-C (简称OC)中,单例模式非常常用,尤其是在需要对资源进行统一管理和控制的场景下。 #### ...

    设计模式PPT合集

    工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在Java中,工厂模式通过创建一个工厂类来生产不同类型的对象,避免了客户代码与具体产品类之间的耦合。 三、抽象工厂模式 抽象工厂模式提供了创建...

    java单例模式开发的7种写法

    单例模式是一种常用的软件设计模式,其目的是确保一个类仅有一个实例,并提供一个全局访问点。在Java编程语言中,实现单例模式的方法有很多种,不同的实现方式具有不同的特点和适用场景。本文将详细介绍七种常见的...

    单例模式.doc

    单例模式是一种常用的创建型设计模式,它的主要目的是确保某个类只有一个实例,并且提供一个全局访问点来获取该实例。这种模式适用于系统中只需要一个实例的情况,例如日志记录器、配置管理等。 #### 三、单例模式...

    多线程单例模式并发访问

    单例模式是一种常用的软件设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。 - **饿汉式**:在类装载时即完成初始化,避免了线程同步的问题。 - **懒汉式**:通过静态内部类或者双重检查锁定的方式来...

    单例模式分享-吴昌良

    通过以上内容的学习,我们可以看到单例模式是一种非常实用的设计模式,尤其适用于需要确保全局唯一实例的场景。掌握单例模式不仅可以帮助我们写出更加高效、简洁的代码,还能在项目开发过程中解决很多实际问题。

    韩顺平_Java设计模式笔记.docx

    本资源摘要信息是对《韩顺平_Java设计模式笔记.docx》的总结和分析,该笔记涵盖了 Java 设计模式的基础知识、设计模式的七大原则、原型设计模式、解释器设计模式、单例设计模式等内容,并对每个设计模式的原理、实现...

    java 多线程单例模式详解

    单例模式(Singleton Pattern)是一种常用的软件设计模式,它确保一个类仅有一个实例,并提供一个全局访问点。这种模式通常用于那些需要频繁实例化然后销毁的对象,或者创建对象需要消耗大量资源的情况,比如读取...

    尚硅谷设计模式源码笔记课件.zip

    本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,...

    23种设计模式,及设计模式的七种设计原则的文档和Java代码实现

    首先,我们要了解七种设计原则,它们是设计模式的基础: 1. 单一职责原则(Single Responsibility Principle, SRP):一个类或模块应该只有一个引起其变化的原因,也就是说,一个类只负责一项职责。 2. 开闭原则...

    java 23种设计模式及具体例子

    java 中的 23 种设计模式可以分为三大类:创建型模式、结构型模式、行为型模式。每种模式都有其特点和应用场景。 1. 工厂方法模式(Factory Method) 工厂方法模式分为三种:普通工厂模式、多个工厂方法模式、静态...

    23种设计模式,创建型模式共5种,结构型模式7种,行为型模式11种

    设计模式是软件开发中的一种重要概念,它是经过实践验证的、通用的、可复用的解决方案,用于解决在软件设计过程中频繁出现的问题。设计模式分为三大类:创建型模式、结构型模式和行为型模式。 **创建型模式**关注的...

    韩顺平_java设计模式笔记

    单例设计模式确保一个类只有一个实例,常见的实现方式有饿汉式、懒汉式、双重检查、静态内部类和枚举。每种方式都有其适用场景和优缺点,例如,枚举是线程安全且懒加载的推荐实现方式。 设计模式的重要性在于提升...

Global site tag (gtag.js) - Google Analytics