首页 > 代码库 > 第1篇 单例模式

第1篇 单例模式

1.什么是单例模式 
单例模式的意思就是对于一个对象来说只有他的一个实例,不可以获取他的多个实例。
2.为什么要用单例模式
有一些地方必须要用到单例模式,或者有些地方使用单例模式可以大大提高程序的运行效率,比如数据库操作,每次进行数据库的操作都只需要数据库的一个连接对象就可以了,如果每次进行数据库的操作都获得一个数据库的连接将会大大降低程序的运行效率,要知道进行一次数据库连接耗费的时间是非常多的。当程序越来越复杂,一个数据库连接对象满足不了的时候,就可以利用数据库连接池来管理这些数据库连接对象,也不是每一次数据库操作就new一个数据库实例。数据库连接池技术其实也属于数据库单例模式的应用。再比如日志管理,要求每日志要统一进行输出,这个时候就必须要利用单例模式了。
3.如何定义单例模式

饿汉式单例模式,

其定义形式如下:

public class Demo {
	private static Demo demo = new Demo();
	private Demo(){
		
	}
	public static Demo getintance(){
		return demo;
	}
}
在该模式下,在类被加载的时候实例就被创建。

懒汉式单例模式,

其定义形式如下:

public class Demo2 {
	private static Demo2 demo2 = null;
	private Demo2(){
		
	}
	public static Demo2 getintance(){
		if(demo2 == null){
			demo2 = new Demo2();			
		}
		return demo2;
	}
}
懒汉式单例模式,顾名思义就是他很懒,只有在要获取实例的而没有创建的时候他才会创建一个实例。但是,懒汉式单例模式有一个缺点,就是在多线程环境下,比如有一个线程正好运行完if(demo2 == null)就被其他线程占得了cpu,这是另外一个线程获得了一个实例,这个时候刚才的那个线程继续执行,又获得了一个实例。这样就获得了两个实例。不符合单例模式的规则啦,而饿汉式单例模式就不存在这个问题。那么应该如何解决这个问题呢?

双检测锁机制的单例模式,

其定义形式如下:

package com.john;

public class Demo3 {
	private static Demo3 demo3 = null;
	private Demo3(){
		
	}
	public static Demo3 getinstance(){
		if(demo3 == null){
			synchronized(Demo3.class){
				if(demo3 == null){
					demo3 = new Demo3();
				}
			}
		}
		return demo3;
	}
}
在这种方式下,这有第一次创建实例的时候才进入同步方法,以后的实例已经创建,将不会再次进入同步方法。

第1篇 单例模式