关于单例模式的几种实现方法

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">最近单例模式有点火,虽然还不太明白为什么,但在这里也做一个总结,顺带也检查下自己对于这个设计模式的掌握,好了,闲话不多说,直接上代码</span>
class Singleton {
	private Singleton(){};
	private static final Singleton instance= new Singleton();
	public static Singleton getInstance() {
		return instance;
	}

这是单例模式最为简单,也是最为常用的一种模式,也就是我们常说的饿汉式实现方法,体现了单例模式的所有特征(构造器私有,通过getIntance方法来获取实例,仅会在内存中构建一个真正的实例),不过这种方法也有缺点,就是每次类加载的时候,由于静态方法都要被加载,如果这个单例的实例要占用大量的资源,启动虚拟机就加载就有点得不偿失了,所以就有人想出了第二种方法,及我们常说的懒汉式方法,闲话不多说,直接上代码

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

上面就是单例模式的懒汉式实现方式,在一开始类加载的时候挂一个null的空连接,然后在使用的时候在创建一个新的对象,既可以节约资源又可以实现单例的目的,和乐而不为~

但渐渐地就有人发现这种模式的问题了,俗话说每一次优化都有可能带来新的问题,上面饿汉式在单线程环境下没有问题,但如果我是在多线程的条件下呢?两个线程一起访问getIntance方法怎么办,同时发现它是null怎么办?这不就违背了单例的初衷了么

所以就有了下面的改进版的懒汉式

public class Singleton {
    private static Singleton instance=null<span style="font-family: Arial, Helvetica, sans-serif;">;  </span>
    private Singleton (){}
    public static synchronized Singleton getInstance() {
    if (instance == null) {
        instance = new Singleton();
    }
    return instance;
    }
}

这样一下就解决了,线程同步的问题,哇,好欢乐,但应用的时候在悲催的发现原来99.9999%的情况都是不需要同步的,而且奇低的效率,让人不忍直视啊,怎么办?改进呗~于是就有了懒汉式2代闪亮登场

public class Singleton {
    private volatile static Singleton singleton=null;
    private Singleton (){}
    public static Singleton getSingleton() {
    if (singleton == null) {
        synchronized (Singleton.class) {
        if (singleton == null) {
            singleton = new Singleton();
        }
        }
    }
    return singleton;
    }
}

这也就是传说中的双重校验锁模式,不得不说想出这种模式的人,不可谓不强大,无比的纠结之心如滔滔洪水,在我的心中绵绵不绝,作者很犀利的看出了在多线程环境下,检测null操作与创建对象操作不一致的问题,它主要考虑的就是多线程的并发但我的心真的看的好纠结啊,还有没有更好的办法呢,就有了我第一次接触单例模式时想到的内部类解决方法

class Singleton {
	private Singleton(){};
	private static class getSingletonInstance{
		private static final Singleton instance = new Singleton();
	}
	 public static Singleton getInstance() {
		 return getSingletonInstance.instance;
	}
}

该方法,主要利用了内部类可以方便的访问外部类的成员变量就像访问自己的成员变量一样优点,因为没有静态属性,在虚拟机启动的时候并不会被初始化,知道调用getIntance方法才会产生具体的实例,而且内部类是static内部类,语义也不会允许有多个实例存在,而java规范规定类的构造必须是原子非并发的所以连getIntance()方法也都不需要加同步synchronized,一切的一切都very prefect ,所以我个人也最推荐使用静态内部类的单例实现方法,当然如果有更好的方法欢迎大家拍砖

时间: 2024-11-09 04:37:56

关于单例模式的几种实现方法的相关文章

设计模式----单例模式的两种创建方法

一.实现单例模式的需要的条件: 1,有私有的构造器; 2,一个静态方法; 3,一个静态变量. 二.实现单例模式的两种方法: 第一种:急切实例化 package singleton; /** * 急切实例化 * @author lenovo * */ public class Singleton2 { private static Singleton2 uniqueInstance = new Singleton2(); private Singleton2(){ } public static

Java单例模式的3种实现方法及特点

最近看到一篇关于Java中instance的文章(http://www.zhihu.com/question/29971746),引发对单例模式的一些思考,并从网上搜集了一些关于Java单例模式的文章,总结如下: 首先,贴出三种单例设计的简单代码: 1.延迟加载——不考虑效率问题的延迟加载 public class SingleTon{ private static SingleTon instance = null; public static synchronized SingleTon g

Python单例模式的4种实现方法

#-*- encoding=utf-8 -*- print '----------------------方法1--------------------------' #方法1,实现__new__方法 #并在将一个类的实例绑定到类变量_instance上, #如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回 #如果cls._instance不为None,直接返回cls._instance class Singleton(object): def __new__(

线程安全的单例模式的几种实现方法分享

1.饿汉式单例 1 public class Singleton { 2 private final static Singleton INSTANCE = new Singleton(); 3 4 5 private Singleton() { } 6 7 public static Singleton getInstance() { 8 return INSTANCE; 9 } 10 } 2.借助内部类属于懒汉式单例,因为Java机制规定,内部类SingletonHolder只有在getIn

JAVA实现单例模式的四种方法和一些特点

JAVA实现单例模式的四种方法和一些特点,需要的朋友可以参考一下 一.饿汉式单例类 复制代码 代码如下: public class Singleton  {      private Singleton(){ } private static Singleton instance = new Singleton(); private static Singleton getInstance(){          return instance;      }  } 特点:饿汉式提前实例化,没有

Android 创建单例模式的几种方法

java模式之单例模式:单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.特点:1,一个类只能有一个实例2,自己创建这个实例3,整个系统都要使用这个实例 Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在.在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作.一些资源管理器常常设计成单例模式.外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中.每台计算

angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

今天我们要讲的是ng2的路由系统. 例子 例子是官网的例子,包含一个“危机中心”和“英雄列表”,都在一个app中,通过路由来控制切换视图.还包含了promise的用法,服务的用法等多个知识点. 源代码: https://github.com/lewis617/angular2-tutorial/tree/gh-pages/router 运行方法: 在根目录下运行: http-server 引入库文件设置base href 路由并不在ng2中,需要我们额外引入,另外我们需要设置base href,

线程安全的单例模式的几种实现

单例模式是一种常见的设计模式:Java Singleton 模式就为我们提供了这样实现的可能.使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数, 有利于Java垃圾回收(garbage collection). 单例模式也是一种比较常见的设计模式,它到底能带给我们什么好处呢?其实无非是三个方面的作用: 1.控制资源的使用,通过线程同步来控制资源的并发访问: 2.控制实例产生的数量,达到节约资源的目的. 3.作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让

PHP面向对象-设计模式 单例模式 简单工厂模式 工厂方法模式

1.单例模式 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例. 要实现每一个类只有一个实例,就需要对实例化进行限制. 单例模式实现要点: ① 构造函数私有化,不允许使用new关键字创建对象  ② 对外提供获取对象的方法.在方法中判断对象是否为空,如果为空则创建对象并返回,如果不为空则直接返回  ③ 实例对象的属性以及获取对象的方法必须是静态的  ④ 之后,创建对象只能使用我们提供的静态方法.