`
haoningabc
  • 浏览: 1449625 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

单例模式7中

    博客分类:
  • java
阅读更多
package com.sohu.zookeeper;

//第一种(懒汉,线程不安全):
public class Singleton {
	private static Singleton instance;

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


// 这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。 第二种(懒汉,线程安全):
public class Singleton {
	private static Singleton instance;

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


// 这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。 第三种(饿汉):
public class Singleton {
	private static Singleton instance = new Singleton();

	private Singleton() {
	};

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


// 这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,
// 虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法,
// 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,
// 这时候初始化instance显然没有达到lazy loading的效果 第四种(饿汉,变种):
public class Singleton {
	private Singleton instance = null;
	static {
		instance = new Singleton();
	}

	public static Singleton getInstance() {
		return this.instance;
	}
} 

// 表面上看起来差别挺大,其实更第三种方式差不多,都是在类初始化即实例化instance。 第五种(静态内部类):

public class Singleton {
	private static class SingletonHolder {
		private static final Singleton INSTANCE = new Singleton();
	}

	public static final Singleton getInstance() {
		return SingletonHolder.INSTANCE;
	}
}


// 这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,
// 它跟第三种和第四种方式不同的是(很细微的差别):第三种和第四种方式是只要Singleton类被装载了,
// 那么instance就会被实例化(没有达到lazy
// loading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。
// 因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,
// 从而实例化instance。想象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,
// 我不希望在Singleton类加载时就实例化,因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,
// 那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比第三和第四种方式就显得很合理。
// 第六种(枚举):
public enum Singleton {
	INSTANCE;
	public void whateverMethod() {
	}
}


// 这种方式是Effective Java作者Josh Bloch
// 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,
// 不过,个人认为由于1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。
// 第七种(双重校验锁):
public class Singleton {
	private volatile static Singleton singleton;

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

分享到:
评论

相关推荐

    7种单例模式

    设计模式之七种单例模式代码及ppt,包含多线程环境测试和反序列化测试

    单例模式的多种实现.docx

    3. 单例模式的7种实现方式 5 3.1饿汉式(使用静态常量) 5 3.2饿汉式(使用静态代码块) 7 3.3懒汉式(线程不安全) 8 3.4懒汉式(线程安全,使用同步方法) 9 3.5双重检查实现单例模式 10 3.6使用静态内部类实现...

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

    此文档为Tom老师的公开课的单例的7种写法的一个文档,充分分析单例模式,值得对设计模式有研究的童鞋下下来好好看看

    单例模式的七种写法

    单例模式的七种写法: 1.第一种(懒汉,线程不安全) 2.第二种(懒汉,线程安全) 3.第三种(饿汉) .....

    java单例模式

    java单例模式开发的7中写法,网上搜索的,可以看看

    关于单例模式的知识要点

    关于单例模式的知识要点: 1、某个类只能有一个实例 2、它必须自行创建这个实例 3、必须自行向这个系统提供这个实例

    单例模式.zip(c#设计模式)

    本压缩包含有两个demo,分别对应<设计模式>第2版,刘伟这本书,单例模式这一章课后习题6、7,如果问题请留言一起探讨,谢谢!

    工厂模式与单例模式

    NULL 博文链接:https://zhaohong.iteye.com/blog/483396

    设计模式—— 七 :单例模式

    单例模式是23个模式中比较简单的模式,应用也非常广泛 什么是单例模式? 单例模式的定义: Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类 只有一个实例...

    这可能是最全的单例模式了

    饿汉变种实现单例模式7. 枚举实现单例模式static修饰下是怎么做到线程安全的?完全不使用synchronized实现单例模式1. CAS(AtomicReference)实现单例模式2. ThreadLocal实现单例模式如何破坏单例如何防止单例被...

    xfhy#Android-Notes#7.单例模式的双重检查锁为什么必须加volatile1

    这种写法可以保证线程安全.两个if都是不能去掉的.如果去掉第一个if: 那么所有的线程都会到这里来先获取锁,然后判断singleton是否为空.所有线程都会串行

    单例模式简介以及C++版本的实现

     单例模式是一种设计模式,它的具体实现和各种语言特性有关,这里主要介绍在C++上面的实现,测试平台为Win7 64位,VS2010开发环境。  根据参考博文中的例子,在此先列举一下各种实现策略,以下均以CSingleton为...

    php实现的mongoDB单例模式操作类

    最后我就封装了一个单例模式的数据库类 使用单例模式是为了避免生成多个实例,浪费资源 下面是封装的代码 class Mongo_db { private static $cli; /** * 不允许初始化 */ private function __construct() { ...

    看了这篇文章,你能和面试官畅谈单例模式

    其实单例模式在C#或者.NET里面更好理解,像win7的任务管理器,在系统中只能创建一个。有些理解了嘛? 单例模式只能有一个实例,实例化其实就是new的过程,是不可能阻止他人不去用new的。所以我们完全可以直接就把这...

    精品源码 C# 27种设计模式源代码

    2 单例模式 2 门面模式 2 模板方法模式 3 策略模式 3 工厂方法模式 3 组合模式 4 抽象工厂模式 4 代理模式 4 命令模式 5 迭代器模式 5 适配器模式 5 原型模式 6 简单工厂模式 6 解释器模式 6 享元模式 7 桥接模式 7 ...

    C#使用简单三层实现获取本地计算机硬件信息以及使用ADO.net操作数据库、用户权限控制、条件筛选、Excel导出、单例模式等功能

    这是一个使用C#简单三层的...3、单例模式 4、C#中的API获取计算机硬件信息 5、用户权限控制 6、NPOI导出数据到Excel 7、数据的条件筛选 ...... 这个demo比较适合新手参考、用到的知识点比较广、希望对新手有一点的帮助

    2.单例模式(Singleton)1

    1. 定义 2. 生活场景 3. 应用场景 4. 模式的优点和缺点 5. 饿汉式和懒汉式 6. 实现案例 7. 案例小结 1. 定义 2. 生活场景 3. 应用

    Java面试 java设计模式整理 单例、工厂、策略等 面试使用,学习使用

    3. 单例模式(Singleton) 4 4.建造者模式(Builder) 4 5. 原型模式(Protype) 5 6.适配器模式(Adapter) 6 7.装饰模式(Decorator) 6 8.代理模式(Proxy) 7 9.外观模式(Facade) 7 10.桥接模式(Bridge) 7 ...

    C#中的五种单例模式(SIngleton)

    1. 写法一(只适用于单线程环境) public sealed class Singleton1 { private Singleton1(){} private static Singleton1 instance = null;...写法一中的代码再多线程中会有问题。若两个线程同时判读instan

Global site tag (gtag.js) - Google Analytics